Существует вариант линкер (я имею в виду 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 работает
Я не» Знаете, что вы подразумеваете под «вашими зависимостями позже»? Мне кажется, что ваша желаемая линия выполняется только путем компиляции в библиотеки boost в вашу библиотеку, чего вы не можете сделать. – jiveturkey
Извинения, но я не согласен. Некоторые символы разрешаются во время ссылки MYLIB. Я просто хотел бы разрешить ВСЕ символы во время ссылки MYLIB. Обратите внимание на то, как мне не нужно связывать boost_thread. – Constantin
Единственный способ, которым символ будет разрешен во время выполнения, - это то, что его подпись и местоположение известны. Наиболее вероятно, что '-lboost_system' не нужно перечислить библиотеку' -lboost_thread', поскольку он знает интерфейс «extern» и находит библиотеку потоков по умолчанию. Чтобы протестировать его, переместите библиотеку 'boost_thread' из' $ LD_LIBRARY_PATH'. – jiveturkey