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?
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
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.
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:
-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ámicasEncontré 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.
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
Por favor agregue: CFLAGS="-lrt"
y LDFLAGS="-lrt"
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:
@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.
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.
El mismo problema me ocurrió cuando uso distcc
para hacer mi proyecto c ++; Finalmente lo resolví con export CXX="distcc g++"
.
Si usa g++
, asegúrese de que no está ejecutando gcc
en su lugar
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.