2016-10-12 11 views
0

У меня проблема очень похожа на this question. Мне нужно сказать компоновщику, чтобы добавить статический lib, несмотря на то, что для ссылки на его символы, кажется, сделано. Причина в том, что библиотека содержит функцию в .init или использует (__attribute__ ((constructor))) для выполнения ее инициализации, которая, в свою очередь, будет вызывать функцию register() из основной программы для регистрации ее функциональности (чтение: передать другую указатели функций).autools, libtool и -Wl, -все-архив

Так что, несмотря на то, что в основной программе не используется символ из библиотеки, основная программа будет вызывать функции из библиотеки, как только последние будут зарегистрированы через функцию init библиотеки.

Но я использую Libtool ... Так беря пример, приведенный в ранее упоминалось вопрос, я должен был бы написать что-то вроде:

bin_PROGRAMS = pktanon 
pktanon_SOURCES = main.cpp 
pktanon_DEPENDENCIES = $(lib_LIBRARIES) 
pktanon_LDADD = libpktanon.la $(LDADD) 

Обратите внимание на «ля» расширение вместо «а "для lib.

Теперь, как я могу передать опцию --whole-archive в компоновщик? Ответ, предложенный в the question, предполагает, что путь к архиву (.a файл) известен ... Неверно, что он жестко кодирует путь, например .libs/libptanon.a в Makefile.am ... И компоновщик делает не нравится встречая .la файл в целом-архив otpion если попробовать:

pktanon_LDFLAGS = -Wl,--whole-archive,libpktanon.la,--no-whole-archive 

есть предложения?

ответ

0

Использование -whole-archive не переносимо, так почему бы не создать библиотеку удобства Libtool? В вашем Automake Makefile.am добавьте noinst_ в библиотеку, а вместо создания статического (возможно, не-pic) статического архива он возьмет все файлы объектов в библиотеке и добавит его ко всему, что ссылается на него. Он переносимый и должен работать в этом случае, поскольку, похоже, вы не хотите, чтобы библиотека была здесь вообще.

+0

Проблема заключается в том, что моя библиотека использует символы из основной программы, а не наоборот: autotools предполагает, что удобство libs L определяет символы, на которые ссылается основная программа P: autotools передаст P и L в компоновщик в этом порядке. Без опции -whole-archive (или -start-group) компоновщик не будет «сшивать» L и P. В моем случае L относится к символам из P: P определяет символы, на которые ссылается L, что является противоположностью предположений autotools. У этого парня была такая же проблема: http://lists.gnu.org/archive/html/automake/2006-03/msg00042.html См. Раздел II (мотивация) раздела 3. – user1159290

+0

Вам будет лучше, если вы исправьте свой дизайн, чтобы он не был круговым - или просто рассматривайте вашу «библиотеку» как коллекцию объектных файлов и не пытайтесь помещать их в архив. Например, такой дизайн нельзя переносить в Windows. –