При связывании: используйте флаг -l или просто рассматривайте архивы как ввод - PullRequest
3 голосов
/ 19 августа 2010

У меня были некоторые проблемы с подключением статической библиотеки stxxl к общей библиотеке, как указано в моем вопросе Связывание статической библиотеки с Boost Python (общая библиотека) - ошибка импорта

Команда Iиспользовался был

g++ -Wall -pthread -march=i686 -I/home/zenna/Downloads/stxxl-1.3.0/include -include stxxl/bits/defines.h -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -I /home/zenna/local/include/ -I /usr/include/python2.6/ -fPIC -c partition.cpp -o obj/Partition_wrap.o

и для связи:

g++  -shared -lboost_python -L/home/zenna/local/lib/ -L/home/zenna/Downloads/stxxl-1.3.0/lib/bk/ -Wall -pthread -L/home/zenna/Downloads/stxxl-1.3.0/lib -lstxxl -o lib/fast_parts.so obj/Partition_wrap.o 

Используя nm я обнаружил, что отсутствующие символы были в окончательной выходной библиотеке общих объектов, но имели тип "U" для неопределенного.

Затем я изменил команду компоновки, чтобы не только использовать -lstxxl, но также добавил весь архивный файл в качестве другого ввода в компоновщик

, чтобы новая команда была (разница в конце)

++ -shared -lboost_python -L / home / zenna / local / lib / -L / home / zenna / Downloads / stxxl-1.3.0 / lib / bk / -Wall -pthread -L / home / zenna/Downloads/stxxl-1.3.0/lib -lstxxl -o lib / fast_parts.so obj / Partition_wrap.o obj / libstxxl.a

Это устранило проблему, насколько я могу судить.

Тогда у меня вопрос В чем разница между использованием флага -l и добавлением архива каквход и почему прежний метод привел к неопределенным символам?

1 Ответ

1 голос
/ 19 августа 2010

Я думаю, что проблема в вашем случае была в том, что вы указали -lstxxl перед объектными файлами. Когда вы ставите libstxxl.a в конце, символы из него читаются снова, и неопределенные символы разрешаются. Вы можете попробовать переместить его до obj/Partition_wrap.o и проверить, не приведет ли это к неопределенным символам.

С man ld

ld -o /lib/crt0.o hello.o -lc

Это говорит ld создать файл с именем output в результате связывания файла "/lib/crt0.o" с "hello.o" и библиотеки "libc.a", который будет исходить из стандартных поисковых каталогов. (См. Обсуждение опции -l ниже.)

Некоторые параметры командной строки для ld могут быть указаны в любой точке командной строки. Тем не менее, параметры, которые относятся к файлам, такие как как -l или -T, вызвать чтение файла в той точке, в которой опция появляется в командной строке, относительно объектных файлов и другие параметры файла.

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

-l namespec

Компоновщик будет искать архив только один раз в том месте, где он указан в командной строке. Если архив определяет символ, который не был определен в каком-либо объекте, который появился перед архивом в командной строке, компоновщик будет включать соответствующий файл (ы) из архива. Однако неопределенный символ в объекте, появляющемся позже в командной строке, не вызовет компоновщик для повторного поиска в архиве.

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

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