2015-06-23 2 views
1

Я создал библиотеку, которую я бы хотел использовать для других.Связь в зависимостях общей библиотеки

компилироваться библиотека:

/usr/bin/g++ -fPIC -shared -Wl,-soname,libMYLIB.so [inputs] -lboost_system -lboost_thread 

Для компиляции Binary:

/usr/bin/g++ myTest.cpp -lMYLIB -lboost_system 

Я хотел бы эту линию только быть:

/usr/bin/g++ myTest.cpp -lMYLIB 

Как избежать необходимости позже укажите зависимости моих библиотек? Какой флаг в компоновщике или компиляторе я ищу?

+0

Я не» Знаете, что вы подразумеваете под «вашими зависимостями позже»? Мне кажется, что ваша желаемая линия выполняется только путем компиляции в библиотеки boost в вашу библиотеку, чего вы не можете сделать. – jiveturkey

+0

Извинения, но я не согласен. Некоторые символы разрешаются во время ссылки MYLIB. Я просто хотел бы разрешить ВСЕ символы во время ссылки MYLIB. Обратите внимание на то, как мне не нужно связывать boost_thread. – Constantin

+0

Единственный способ, которым символ будет разрешен во время выполнения, - это то, что его подпись и местоположение известны. Наиболее вероятно, что '-lboost_system' не нужно перечислить библиотеку' -lboost_thread', поскольку он знает интерфейс «extern» и находит библиотеку потоков по умолчанию. Чтобы протестировать его, переместите библиотеку 'boost_thread' из' $ LD_LIBRARY_PATH'. – jiveturkey

ответ

1

Существует вариант линкер (я имею в виду ld линкер http://linux.die.net/man/1/ld) --unresolved-символы = игнорирующие-все или -unresolved-символы = игнорирующие в объектно-файлы:

Determine how to handle unresolved symbols. There are four possible values for method: 

* ignore-all 
    Do not report any unresolved symbols. 
* report-all 
    Report all unresolved symbols. This is the default. 
* ignore-in-object-files 
    Report unresolved symbols that are contained in shared libraries, but ignore them if they come from regular object files. 
* ignore-in-shared-libs 
    Report unresolved symbols that come from regular object files, but ignore them if they come from shared libraries. This can be useful 

при создании динамический двоичный код, и известно, что все общие библиотеки , которые должны быть ссылки, включены в командную строку компоновщика .

И это пример. У меня есть библиотека libmylib.so и приложение main:

Итак, сначала я строю библиотека:

$ g++ -fpic -shared mylib.cpp -o libmylib.so 

Когда я строю приложение, но я не добавляю -lmylib в командной строке. Обычно это приводит к ошибке Unresolved external symbols но так как я добавить -Wl,--unresolved-symbols=ignore-in-object-files в командную строку я не получаю ошибки:

$ g++ -fpic -g main.cpp -Wl,--unresolved-symbols=ignore-in-object-files -Wl,-rpath,. 

Затем я запустить свою программу:

$ ./a.out 
./a.out: symbol lookup error: ./a.out: undefined symbol: _Z7my_funcd 

Это не работает, как ожидалось, но тогда я использование LD_PRELOAD:

$ LD_PRELOAD=./libmylib.so ./a.out             
2 

Так с LD_PRELOAD работает

+0

Это замечательно! Возможно ли иметь '' 'ignore-in-shared-libs''', запеченный в создании общей библиотеки? В вашем примере используется опция компоновщика во время создания исполняемого файла, я бы хотел использовать эту опцию во время создания созданной библиотеки. – Constantin

+0

Вы можете использовать «ignore-all», но кажется, что если вы создаете библиотеку с «gcc -shared», это не обязательно, поскольку 'gcc' не жалуется на неразрешенные символы –

Смежные вопросы