Странная ошибка связывания: DSO отсутствует в командной строке



когда я компилирую openvswitch-1.5.0, я столкнулся со следующей ошибкой компиляции:



 gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith
-Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init -g -O2 -export-dynamic ***-lpthread*** -o utilities/ovs-dpctl utilities/ovs-dpctl.o lib/libopenvswitch.a
/home/jyyoo/src/dpdk/build/lib/librte_eal.a
/home/jyyoo/src/dpdk/build/lib/libethdev.a
/home/jyyoo/src/dpdk/build/lib/librte_cmdline.a
/home/jyyoo/src/dpdk/build/lib/librte_hash.a
/home/jyyoo/src/dpdk/build/lib/librte_lpm.a
/home/jyyoo/src/dpdk/build/lib/librte_mbuf.a
/home/jyyoo/src/dpdk/build/lib/librte_ring.a
/home/jyyoo/src/dpdk/build/lib/librte_mempool.a
/home/jyyoo/src/dpdk/build/lib/librte_malloc.a -lrt -lm
/usr/bin/ld: /home/jyyoo/src/dpdk/build/lib/librte_eal.a(eal.o): undefined reference
to symbol 'pthread_create@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from
command line


Если я попытаюсь увидеть символы libpthread, это выглядит нормально.



$ readelf -s /lib/x86_64-linux-gnu/libpthread.so.0 | grep pthread_create
199: 0000000000008220 2814 FUNC GLOBAL DEFAULT 13 pthread_create@@GLIBC_2.2.5
173: 0000000000008220 2814 FUNC LOCAL DEFAULT 13 __pthread_create_2_1
462: 0000000000008220 2814 FUNC GLOBAL DEFAULT 13 pthread_create@@GLIBC_2.2


не могли бы вы дать какие-либо подсказки или указатели?

1289   10  

10 ответов:

вы должны упомянуть библиотеку в командной строке после объектные файлы, скомпилированные:

 gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith -Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init \
     -g -O2 -export-dynamic -o utilities/ovs-dpctl utilities/ovs-dpctl.o \
     lib/libopenvswitch.a \
     /home/jyyoo/src/dpdk/build/lib/librte_eal.a /home/jyyoo/src/dpdk/build/lib/libethdev.a /home/jyyoo/src/dpdk/build/lib/librte_cmdline.a /home/jyyoo/src/dpdk/build/lib/librte_hash.a /home/jyyoo/src/dpdk/build/lib/librte_lpm.a /home/jyyoo/src/dpdk/build/lib/librte_mbuf.a /home/jyyoo/src/dpdk/build/lib/librte_ring.a /home/jyyoo/src/dpdk/build/lib/librte_mempool.a /home/jyyoo/src/dpdk/build/lib/librte_malloc.a \
     -lrt -lm -lpthread 

пояснение: связывание зависит от порядка модулей. Символы сначала запрашиваются, а затем связываются из библиотеки, в которой они есть. Таким образом, вы должны указать модули, которые используют библиотеки в первую очередь, и библиотеки после них. Вот так:

gcc x.o y.o z.o -la -lb -lc

кроме того, если есть циклическая зависимость, вы должны указать ту же библиотеку на командная строка несколько раз. Так что на всякий случай libb нужен символ libc и libc нужен символ libb командная строка должна быть:

gcc x.o y.o z.o -la -lb -lc -lb

сообщение об ошибке зависит от дистрибутива / версии компилятора:

Ubuntu Дерзкий:

/usr/bin/ld: /mnt/root/ffmpeg-2.1.1//libavformat/libavformat.a(http.o): undefined reference to symbol 'inflateInit2_'
/lib/x86_64-linux-gnu/libz.so.1: error adding symbols: DSO missing from command line

Ubuntu Raring: (более информативно)

/usr/bin/ld: note: 'uncompress' is defined in DSO /lib/x86_64-linux-gnu/libz.so.1 so try adding it to the linker command line

устранение: возможно, Вам не хватает библиотеки на этапах компиляции, на этапе компоновки. В моем случае я добавил '- lz' для флагов makefile / GCC.

Справочная информация: DSO-это динамический общий объект или общая библиотека.

я нашел другой случай, и поэтому я думаю, что вы все ошибаетесь.

вот что у меня было:

/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: eggtrayicon.o: undefined reference to symbol 'XFlush'
/usr/lib64/libX11.so.6: error adding symbols: DSO missing from command line

проблема в том, что командная строка не содержит -lX11 - хотя libX11.so следует добавить в качестве зависимости, потому что в аргументах также были библиотеки GTK и GNOME.

Итак, единственное объяснение для меня заключается в том, что это сообщение могло быть предназначено помочь, но он не сделал это должным образом. Это было, вероятно, просто: библиотека, которая предоставляет символ, не была добавлена в командную строку.

обратите внимание на три важных правила, касающиеся связи в POSIX:

  • динамические библиотеки имеют определенные зависимости, поэтому только библиотеки из верхней зависимости должны быть предоставлены в любом порядке (хотя и после статических библиотек)
  • статические библиотеки только неопределенные символы - это до вас, чтобы знать их зависимости и поставить все из них в команду линия
  • порядок статический библиотеки всегда: истец впервые,провайдер следующее. В противном случае вы получите неопределенное символьное сообщение, как и тогда, когда вы забыли добавить библиотеку в командную строку
  • при указании библиотеки с помощью -l<name>, вы никогда не знаете, будет ли он принимать lib<name>.so или lib<name>.a. Динамическая библиотека предпочтительна, если она найдена, а статические библиотеки могут быть применены только с помощью параметра компилятора-это все. И есть ли у вас какие-либо проблемы, как указано выше, это зависит от того, были ли у вас статические или динамические библиотеки
  • ну, иногда зависимости могут отсутствовать в динамических библиотеках: D

Я обнаружил, что у меня была та же ошибка. Я компилировал код как с lapack, так и с blas. Когда я переключил порядок, что две библиотеки были вызваны ошибка ушла.

"LAPACK_LIB = - llapack-lblas" работал где "LAPACK_LIB = - lblas-llapack" выдал ошибку, описанную выше.

Я также столкнулся с той же проблемой. Я не знаю, почему, я просто добавить -lpthread опция для компилятора и все в порядке.

старый:

$ g++ -rdynamic -m64 -fPIE -pie  -o /tmp/node/out/Release/mksnapshot ...*.o *.a -ldl -lrt

получил следующее сообщение об ошибке. Если я добавлю -lpthread опция выше команды, то ОК.

/usr/bin/ld: /tmp/node/out/Release/obj.host/v8_libbase/deps/v8/src/base/platform/condition-variable.o: undefined reference to symbol 'pthread_condattr_setclock@@GLIBC_2.3.3'
//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Я обнаружил, что иногда библиотека, на которую жалуется компоновщик, не является причиной проблемы. Возможно, есть умный способ решить, где проблема, но это то, что я делаю:

  • закомментируйте все связанные библиотеки в команде link.
  • очистить все .o's,. so и т. д. (Обычно достаточно очистить, но вы можете запустить рекурсивный find + rm или что-то подобное).
  • раскомментируйте библиотеки в ссылке команда по одному за раз и перестроить порядок по мере необходимости.

@peter karasev: я столкнулся с той же проблемой с проектом gcc 4.8.2 cmake на CentOS7. Важен порядок библиотек в разделе "target_link_libraries". Я предполагаю, что cmake просто передает список компоновщику как есть, т. е. он не пытается выработать правильный порядок. Это разумно - когда вы думаете об этом cmake не может знать, что правильный порядок, пока связь не будет успешно завершенный.

пожалуйста, добавьте: CFLAGS="-lrt" и LDFLAGS="-lrt"

то же самое произошло со мной, когда я устанавливал тест HPCC (включая HPL и несколько других тестов). Я добавил -lm к флагам компилятора в моем скрипте сборки, а затем он успешно скомпилирован.

та же проблема случилась со мной, когда я использую distcc сделать мой проект c++ ; Наконец я решил его с export CXX="distcc g++".

при использовании g++ убедитесь, что вы не используете

Comments

    Ничего не найдено.