Подтвердить что ты не робот

Какова сделка с символами undefined в общей библиотеке или dylib?

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

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

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

-undefined suppress -flat_namespace

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

4b9b3361

Ответ 1

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

Ответ 2

Используйте 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`