У меня есть следующие настройки:Статическая библиотека связаны два раза
- Статическая библиотека
- Динамическая библиотека, которая связывается с (1)
- исполняемый файл, который связывает с (1.) и (2.)
Код из статической библиотеки теперь дублируется и присутствует в динамической библиотеке и исполняемом файле.
Вопросы:
это данные (глобальные переменные, статические члены класса) также дублируется и не исполняемый файл и длл увидеть одни и те же данные?
Есть ли разница между Linux и Windows?
Как бы вы это разрешили?
Edit:
Спасибо за ответы, я могу не объяснить, что произошло в моем случае точно.
В статической библиотеке не было флажков экспорта/импорта. Динамическая библиотека шляпу экспорта на свои собственные символы.
Окна:
Динамическая библиотека была копия текста + данных segement статической библиотеки. Исполняемый не мог знать, что динамическая библиотека связала статическую библиотеку, потому что не из символов статической библиотеки видны снаружи.
Linux:
Динамическая библиотека была копия segement текстовых данных статической библиотеки. Динамическая библиотека, хотя и включала все символы (текст и данные) из статической библиотеки в свою собственную таблицу символов. -> Исполняемый файл видит, что динамическая библиотека уже определила все символы статической библиотеки и не переопределяет их.
Это плохо, потому что вы, как правило, хотите иметь такое же поведение в Linux и на окнах.
Share символы (по умолчанию на Linux)
- Добавить команду DLL экспорта всех символов из статической библиотеки при связывании его к общей библиотеке.
__attribute__ ((dllexport))
- Добавить команду импорта dll при связывании статической библиотеки с исполняемым файлом.
__attribute__ ((dllimport))
- код и данные хранятся только в общей библиотеке и связываемый от внешнего
- Добавить команду DLL экспорта всех символов из статической библиотеки при связывании его к общей библиотеке.
Reduntant символов (по умолчанию на окнах)
- Вы должны убедиться, что символы статическая библиотека не включена в таблицу символов разделяемой библиотеки
__attribute__ ((visibility ("hidden")))
по gcc- При связывании исполняемого файла символы из статического li Брары не могут быть найдены нигде, поэтому они снова включены.
Да, данные дублируются. Вы решили бы его с помощью динамической библиотеки. – UmNyobe
@UmNyobe: есть уже DLL; создание другого не помогло бы, поскольку оно не будет передавать глобальные данные с первого. –
Являются ли библиотеки предварительно скомпилированными или доступными в качестве исходного кода? –