Как обстоят дела с неопределенными символами в общей библиотеке или dylib? - PullRequest
19 голосов
/ 12 сентября 2010

У меня есть Makefile для Linux, который я переношу в Дарвин.Makefile берет кучу файлов .o и связывает их вместе в общий объект .so.Итак, я понял (я не прав насчет этого?), Что лучшим аналогом для этого в Дарвине является dylib.Поэтому я изменил флаг -shared на -dynamiclib.

Теперь код, который я объединяю в dylib, зависит от множества внешних библиотек.Когда я пытаюсь создать dylib, я получаю сообщения об ошибках, указывающие на наличие неопределенных ссылок.Но Makefile для Linux не указывает ни один из параметров -lwh независимо или -L / path / what на этапе сборки, который создает файл .so.Хм?Это связано с тем, что при создании файла .so ELF по умолчанию он оставляет внешние ссылки неразрешенными, а затем, когда загружается общая библиотека, рекурсивно загружает общие библиотеки, которые зависят от используемой вами общей библиотеки.загрузка?Разве не было бы так, что если бы разделяемая библиотека зависела от файла .a или .o, вы бы ДОЛЖНЫ статически связать их с разделяемой библиотекой, иначе вы не могли бы связать во время выполнения?Как можно избежать наличия неопределенных ссылок в библиотеке, которая загружается во время выполнения, если ссылки также не относятся к динамически загружаемым библиотекам?

В любом случае, если я укажу

-undefined suppress -flat_namespace

, это неМне не нужно добавлять эти параметры -l и -L при создании общей библиотеки.Но я все еще не понимаю, как это в конечном итоге может работать.

Ответы [ 2 ]

16 голосов
/ 05 марта 2011

В этой теме также обсуждается эта проблема.Я думаю, что ключевым моментом является то, что для того, чтобы получить Linux-подобное поведение линковки, вам нужно указать флаг -undefined dynamic_lookup.По умолчанию компоновщик Дарвина выдает ошибку, если в динамической библиотеке есть неопределенные ссылки.Вы также можете использовать -U, чтобы установить это поведение для каждого символа.См. Man ld для справки.

1 голос
/ 12 сентября 2010

Использование libtool.

libtool -dynamic -multiply_defined suppress -install_name `basename ../../../../rlp/lib/universal-darwin9-gcc40/libbtutils.dylib` -o ../../../../rlp/lib/universal-darwin9-gcc40/libbtutils.dylib   ../../../../rlp/lib/universal-darwin9-gcc40/libbtd.a ../../../../rlp/lib/universal-darwin9-gcc40/libbttrie.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtkey.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtunit.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtutilities.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtopts.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtxcode.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtprops.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtxml.a ../../../../rlp/lib/universal-darwin9-gcc40/libbttake3.a ../../../../rlp/lib/universal-darwin9-gcc40/libbttake5.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtac.a  -lstdc++.6 -lgcc_s.10.4 ../../../../build_system/lib/universal-darwin9-gcc40/libgcc.a -lSystem -lSystemStubs`
...