libpthread.so.0: ошибка при добавлении символов: 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 '[email protected]@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 [email protected]@GLIBC_2.2.5
   173: 0000000000008220  2814 FUNC    LOCAL  DEFAULT   13 __pthread_create_2_1
   462: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 [email protected]@GLIBC_2.2

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

Ответ 1

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

 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

Ответ 2

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

Ubuntu Saucy:

/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' в флаги make файла /GCC.

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

Ответ 3

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

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

/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

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

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

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

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

Ответ 4

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

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

Ответ 5

Я также столкнулся с той же проблемой. Я не знаю, почему, я просто добавляю параметр -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 '[email protected]@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

Ответ 6

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

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

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

Ответ 7

Добавьте: CFLAGS="-lrt" и LDFLAGS="-lrt"

Ответ 8

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

Ответ 9

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

Ответ 10

Если вы используете g++, убедитесь, что вы не используете вместо этого gcc

Ответ 11

Фон

DSO missing from command line сообщении DSO missing from command line будет отображаться, когда компоновщик не найдет требуемый символ при обычном поиске, но символ доступен в одной из зависимостей непосредственно указанной динамической библиотеки.

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

Что делать?

Если вы являетесь сопровождающим программного обеспечения

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

Если вы просто пытаетесь скомпилировать программное обеспечение

В качестве обходного пути можно переключиться обратно к более разрешающему представлению о том, какие символы доступны, используя опцию -Wl,--copy-dt-needed-entries.

Распространенные способы внедрить это в сборку - экспортировать LDFLAGS перед запуском configure или подобного:

export LDFLAGS="-Wl,--copy-dt-needed-entries"

Иногда передача LDFLAGS="-Wl,--copy-dt-needed-entries" напрямую для make может также работать.