Форум программистов, компьютерный форум CyberForum.ru

Связывание библиотек - C++

Восстановить пароль Регистрация
 
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
11.06.2013, 14:36     Связывание библиотек #1
Допустим есть решение из 4 проектов- Common, A , B и Program.

Common содержит некие общие классы и интерфейсы ( например работа с памятью, потоками ). Не является библиотекой.
A и B - некие либы, часть приложения Program, оба используют зависимы Common.

Потребность в вариантах сборки:
* Динамическая: A.dll, B.dll, Program.exe
* Статическая. Program.exe

Для примера у нас в Common определен некий аллокатор Allocator в файлах( Allocator.h и Allocator.cpp ) и тип MyMap в файле Types.h, который по существу typedef std::map с моим аллокатором Allocator.

Обе библиотеки и сама программа работают с данным типом.

Как лучше организовать сборку проектов?

В голову приходит 2 мысли:

1) При сборки A , B и Program подключать исходные файлы Common, тем самым дублируя код, но это глупо.
2) Видел проекты где под либы программа выделяет фиксированные адреса. Как я понял в таком случае Program нужно собирать с Common. Далее Program подгружает либы в заранее определённые адреса. В итоге выходит полный аналог статической линковки, где либам будут известны адреса реализации Common. Но как это организовать - не знаю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 14:36     Связывание библиотек
Посмотрите здесь:

C++ Позднее и раннее связывание
C++ Не получается явное связывание
C++ Раннее и позднее связывание
C++ связывание 2-х классов
Связывание классов в 1 файле C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,358
Завершенные тесты: 1
11.06.2013, 16:32     Связывание библиотек #2
Цитата Сообщение от kvadro Посмотреть сообщение
) При сборки A , B и Program подключать исходные файлы Common, тем самым дублируя код, но это глупо.
Сделайте Common библиотекой (dll, lib).

Цитата Сообщение от kvadro Посмотреть сообщение
2) Видел проекты где под либы программа выделяет фиксированные адреса. Как я понял в таком случае Program нужно собирать с Common. Далее Program подгружает либы в заранее определённые адреса. В итоге выходит полный аналог статической линковки, где либам будут известны адреса реализации Common. Но как это организовать - не знаю.
Не знаю, что именно имеется в виду, но звучит как грязный и непереносимый хак.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
21.06.2013, 15:21  [ТС]     Связывание библиотек #3
Сделайте Common библиотекой (dll, lib).
Подтягивать функции из dll Common будет неудобно ведь.

Не знаю, что именно имеется в виду, но звучит как грязный и непереносимый хак.
По идеи мы подгружаем библиотеку и получаем все её функции в основной программе без всяких dlsym.

Добавлено через 18 часов 11 минут
или я не прав?

Добавлено через 1 час 30 минут
ап
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,358
Завершенные тесты: 1
21.06.2013, 16:04     Связывание библиотек #4
Цитата Сообщение от kvadro Посмотреть сообщение
Подтягивать функции из dll Common будет неудобно ведь.
Поясните, что что значит "подтягивать" и почему неудобно.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
21.06.2013, 16:30  [ТС]     Связывание библиотек #5
Убежденный
Допустим есть приложение и его модули A, B.

Модуль A

A/A.h:
C++
1
2
3
4
5
6
7
8
namespace A
{
  class A
  {
    public:
      method();
  }
}
В A/A.cpp реализация


Модуль B

B/B.h:
C++
1
2
3
4
5
6
7
8
namespace B
{
  class B
  {
    public:
      method();
  }
}
В B/B.cpp реализация


Ну и программа main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
#include "A/A.h"
#include "B/B.h"
 
int main()
{
    A a;
    B b;
 
    return 0;
}
В релизе должен быть один исходный файл, а значит линкуем main.cpp, A.cpp, B.cpp.
В дебаге модули должны быть реализованы как отдельные либы. Как приложению подхватить реализацию классов A и B в таком случае?

Добавлено через 11 минут
Я говорю про глобальную область видимости. Пример выше привёл крайне неудачный.
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,358
Завершенные тесты: 1
21.06.2013, 16:50     Связывание библиотек #6
Можно сделать так, чтобы A и B, в зависимости от конфигурации, собирались в
статические или динамические библиотеки. При этом у них в обоих случаях
будут файлы .lib. Вот пускай главный модуль вместо cpp-реализаций A и B
подключает эти .lib-файлы. Своего рода абстракция от типа сборки модулей.
Yandex
Объявления
21.06.2013, 16:50     Связывание библиотек
Ответ Создать тему
Опции темы

Текущее время: 12:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru