it-swarm-es.com

libpthread.so.0: error al agregar símbolos: falta DSO en la línea de comandos

Cuando estoy compilando openvswitch-1.5.0, he encontrado el siguiente error de compilación:

 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

Si trato de ver los símbolos de libpthread, se ve bien.

$ 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

¿Podrías dar alguna pista o sugerencia?

173
jaeyong

Debe mencionar la biblioteca en la línea de comandos después los archivos de objeto que se están compilando:

 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 

Explicación: la vinculación depende del orden de los módulos. Los símbolos se solicitan primero y luego se vinculan desde una biblioteca que los tiene. Así que tienes que especificar los módulos que usan primero las bibliotecas, y las bibliotecas después de ellos. Me gusta esto:

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

Además, en caso de que haya una dependencia circular, debe especificar la misma biblioteca en la línea de comandos varias veces. Entonces, en caso de que libb necesite un símbolo de libc y libc necesite un símbolo de libb, la línea de comando debe ser:

gcc x.o y.o z.o -la -lb -lc -lb
131
Michael Pankov

El mensaje de error depende de la distribución/versión del compilador:

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: (más informativo)

/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

Solución: Puede que falte una biblioteca en sus pasos de compilación, durante la etapa de vinculación. En mi caso, agregué '-lz' a makefile/GCC flags.

Fondo: DSO es un objeto compartido dinámico o una biblioteca compartida.

44
kevinf

Encontré otro caso y, por lo tanto, creo que están todos equivocados.

Esto es lo que yo tenía:

/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

El problema es que la línea de comando DID NO contiene -lX11 - aunque el libX11.so debe agregarse como una dependencia porque también había bibliotecas GTK y GNOME en los argumentos.

Entonces, la única explicación para mí es que este mensaje podría haber tenido la intención de ayudarlo , pero no lo hizo correctamente. Probablemente esto fue simple: la biblioteca que proporciona el símbolo no se agregó a la línea de comandos.

Tenga en cuenta tres reglas importantes relacionadas con el enlace en POSIX:

  • Las bibliotecas dinámicas tienen dependencias definidas, por lo que solo las bibliotecas de la dependencia superior deben proporcionarse en cualquier orden (aunque después de las bibliotecas estáticas)
  • Las bibliotecas estáticas solo tienen símbolos indefinidos: depende de usted conocer sus dependencias y suministrarlas todas en la línea de comandos.
  • El orden en estático bibliotecas es siempre: el solicitante primero , el proveedor sigue . De lo contrario, aparecerá un mensaje de símbolo indefinido, como cuando se olvidó de agregar la biblioteca a la línea de comandos.
  • Cuando especifica la biblioteca con -l<name>, nunca se sabe si tomará lib<name>.so o lib<name>.a. La biblioteca dinámica es la preferida, si se encuentra, y las bibliotecas estáticas solo pueden imponerse mediante la opción del compilador, eso es todo. Y si tiene algún problema como el anterior, depende de si tiene bibliotecas estáticas o dinámicas
  • Bueno, a veces las dependencias pueden faltar en las bibliotecas dinámicas: D
14
Ethouris

Encontré que tenía el mismo error. Estaba compilando un código con lapack y blas. Cuando cambié el orden en que se llamaban las dos bibliotecas, el error desapareció.

"LAPACK_LIB = -llapack -lblas" funcionó donde "LAPACK_LIB = -lblas -llapack" dio el error descrito anteriormente.

6
user3112632

También me encontré con el mismo problema. No sé por qué, solo agrego la opción -lpthread al compilador y todo está bien.

Antiguo:

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

obtuve el siguiente error. Si agrego la opción -lpthread al comando anterior, entonces OK.

/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
4
osexp2003

Por favor agregue: CFLAGS="-lrt" y LDFLAGS="-lrt"

2
劉大為

Lo que he encontrado es que a veces la biblioteca de la que se queja el vinculador no es la que causa el problema. Posiblemente haya una manera inteligente de averiguar dónde está el problema, pero esto es lo que hago:

  • Comente todas las bibliotecas enlazadas en el comando de enlace.
  • Limpie todos los .o, .so, etc. (Por lo general, limpiar es suficiente, pero es posible que desee ejecutar un hallazgo + rm recursivo, o algo similar).
  • Descomente las bibliotecas en el comando de enlace de una en una y vuelva a organizar el orden según sea necesario.

@peter karasev: Me he encontrado con el mismo problema con un proyecto gcc 4.8.2 cmake en CentOS7. El orden de las bibliotecas en la sección "target_link_libraries" es importante. Supongo que cmake simplemente pasa la lista al enlazador tal como está, es decir, no intenta resolver el orden correcto. Esto es razonable: cuando lo piensa, no puede saber cuál es el orden correcto hasta que se complete el enlace con éxito.

2
AhrB

Fondo

El mensaje DSO missing from command line aparecerá cuando el vinculador no encuentre el símbolo requerido con su búsqueda normal, pero el símbolo está disponible en una de las dependencias de una biblioteca dinámica especificada directamente.

En el pasado, el enlazador consideraba que los símbolos en las dependencias de idiomas especificados estaban disponibles. Pero eso cambió en una versión posterior y ahora el enlazador impone una visión más estricta de lo que está disponible. Por lo tanto, el mensaje está destinado a ayudar con esa transición.

¿Qué hacer?

Si usted es el mantenedor del software

Debe resolver este problema asegurándose de que todas las bibliotecas necesarias para satisfacer los símbolos necesarios se especifiquen directamente en la línea de comandos del vinculador. También tenga en cuenta que el orden a menudo importa.

Si solo está tratando de compilar el software

Como solución alternativa, es posible volver a la vista más permisiva de qué símbolos están disponibles mediante la opción -Wl,--copy-dt-needed-entries.

Las formas comunes de inyectar esto en una compilación son exportar LDFLAGS antes de ejecutar configure o similar como esto:

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

A veces, pasar LDFLAGS="-Wl,--copy-dt-needed-entries" directamente a make también podría funcionar.

1
textshell

El mismo problema me ocurrió cuando uso distcc para hacer mi proyecto c ++; Finalmente lo resolví con export CXX="distcc g++".

1
Jason Geng

Si usa g++, asegúrese de que no está ejecutando gcc en su lugar

0
Martin R.

Lo mismo me sucedió cuando estaba instalando el punto de referencia HPCC (incluye HPL y algunos otros puntos de referencia). Agregué -lm a las banderas del compilador en mi script de compilación y luego las compilé con éxito.

0
Jon Doh