2016-08-11 7 views
0

Я привожу ОС Ubuntu 14.04 до стандарта сборки. Цель состоит в том, чтобы заменить существующий строитель SUSE SLED 11 SP2. Но я ошибся, что мне трудно объяснить.Объяснение различия между g ++ на SUSE SLED 11 SP2 по сравнению с Ubuntu 14.04

Команда сборки, которая производит ошибку в

g++ 
-o 
out/linux-rel/bin/PrtReporter 
-fstack-protector 
-m32 
-Wl,-rpath,/local/out/linux-rel/bin 
-l:libz.so.1.2.8 
out/linux-rel/obj-static/prt/CrashReporter.o 
out/linux-rel/obj-static/prt/LibArchiveWrapper.o 
out/linux-rel/obj-static/utilities/RTSConfigUtilities.o 
-Lout/linux-rel/bin 
-Lout/linux-rel/bin 
out/linux-rel/bin/libcurl.so 
out/linux-rel/bin/libcurl.a 
out/linux-rel/bin/libarchive.a 
-lpthread 
-lrt 
-lxml2 

В Ubuntu это приводит к ошибке связи. g ++ не может найти символы из libz.

Чтобы исправить это, я могу просто разместить -l: libz.so.1.2.8 после выхода/linux-rel/bin/libarchive.a. Это «выглядит» правильно, поскольку позволяет libarchive.a находить символы libz. то есть, я считаю, должен быть указан после библиотеки, которая зависит от них.

Но я не знаю, почему это необходимо на Ubuntu. Эта же команда отлично работает на SLED.

Любые идеи?

+0

http://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc –

+0

Полезная ссылка. Но это не объясняет разницу между Ubuntu и SLED для меня. –

+0

А - Я слишком скоро заговорил. Ссылка, которую я нашел в приведенном выше, помогла ответить на мой вопрос. А именно http://stackoverflow.com/questions/7826448/linking-libraries-with-gcc-order-of-arguments - что приводит к https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition. Итак, это конкретные изменения Ubuntu, сделанные в ld? Необычный. –

ответ

1

g ++ не может найти символы из libz.

Вы в неправильном месте на линии связи libz и Ubuntu написал GCC пройти --as-needed линкера по умолчанию.

Вы можете запустить readelf -d PrtReporter | grep libz и убедиться, что отсутствует libz.so (т. Е. Загрузчик даже не попытается загрузить его).

Чтобы исправить, добавьте -Wl,--no-as-needed или (лучше) переместить libz, чтобы исправить положение на линии ссылки.

+0

Спасибо. Это хорошее объяснение. –

+0

FYI: этот флаг может быть установлен на g ++ с использованием -Xlinker --no-as-needed. -Xlinker позволяет передавать команды на ld. –

+0

@ShaneGannon Вы должны использовать '-Wl, - no-as-needed' вместо' -Xlinker'. Исправление * Proper * по-прежнему перемещает 'libz' в правильное положение на линии ссылки. –

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

  • Нет связанных вопросов^_^