Tengo un problema extraño y he pasado por todas las preguntas similares pero no puedo encontrar una respuesta.
Estoy tratando de compilar un código que sigue arrojando un error de referencia indefinido a pesar de que la biblioteca se especifica usando -l y también está en LD_LIBRARY_PATH. No puedo entender la razón. Aquí hay un ejemplo
gcc -L/inicio/sam/gmdb/lib -L/inicio/sam/db/complementos/lib -L/inicio/sam/convert/lib -L/inicio/sam/rtana/lib -L/inicio/ sam/rtana/add-ons/lib -o /home/sam/gmdb/bin/server /home/sam/db/obj/tools/server/server.o /home/sam/db/obj/tools/common/ tool_data_parse.o /home/sam/db/obj/tools/common/tool_param.o /home/sam/gmdb/obj/tools/common/tool_public.o -lgmcommon -L/home/sam/db/add-ons/ vpp/lib/suse -lipsi_crypto -lipsi_osal -lipsi_pse -lipsi_ssl -lgmmd5 -lgmkernel -lgmpl -lgmrep -lgmsqlserver -lgmsqlclient -lconvert -lrtana -lglog -lgflags -lprotobuf -lre2 -lboost_timer -lnuma -lpthread -lm -lrt
La lista de errores indefinidos es larga pero el primero es
/home/usama/convert/lib/libconvert.so: referencia indefinida a `numa_num_configured_cpus'
Entonces, como puede ver, se queja de un método en libnuma. A libnuma se le proporciona un -lnuma como puede ver, y está presente en /usr/lib
El error menciona libconvert, que es solo una biblioteca compartida que tiene una llamada a numa_num_configured_cpus pero no está vinculada con libnuma, y no debería importar, ya que libconvert es solo un archivo so. Proporciono el -lnuma mientras genero el ejecutable como puede ver arriba. Aquí está el nm en libconvert
nm -C -u convert/lib/libconvert.so | grep numa* U google::protobuf::internal::NameOfEnum(google::protobuf::EnumDescriptor const*, int) U numa_num_configured_cpus U numa_num_configured_nodes
Intenté compilar con --unresolved-symbols, lo que da como resultado una compilación exitosa, pero el binario no se ejecuta nuevamente y se queja de símbolos indefinidos.
Mi versión de GCC es
gcc --version gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Y Ubuntu es Ubuntu 12.10 de 64 bits
¿Alguien tiene una pista si estoy golpeando un error o lo que está pasando?
Chicos gracias por sus comentarios. El problema que encontré se debe a que el comportamiento predeterminado de gcc se cambia en Ubuntu (al menos la versión que estoy usando) La sugerencia está en esta página wiki de debian https://wiki.debian.org/ToolChain/DSOLinking
De acuerdo con esto, el gcc se cambia para agregar --según sea necesario al enlazador. La desventaja de este comportamiento es que y cito la wiki "Los binarios, que usan símbolos de una biblioteca compartida indirectamente vinculada, no podrán vincularse".
Este era exactamente el problema conmigo, ya que libconvert usaba libnuma, pero no estaba vinculado a él, y el binario que estaba creando intentaba vincularlo todo, incluidos libconvert y libnuma. El gcc predeterminado funcionaría porque no usa un comportamiento necesario que se cambia en Debian y también se hizo en Ubuntu.
En resumen, la vinculación funciona si agrego -Wl,--no-as-needed
.
gcc -Wl,--no-según sea necesario -L/home/sam/gmdb/lib -L/home/sam/db/add-ons/lib -L/home/sam/convert/lib -L/home/ sam/rtana/lib -L/home/sam/rtana/add-ons/lib -o /home/sam/gmdb/bin/server /home/sam/db/obj/tools/server/server.o /home/ sam/db/obj/tools/common/tool_data_parse.o /home/sam/db/obj/tools/common/tool_param.o /home/sam/gmdb/obj/tools/common/tool_public.o -lgmcommon -L/ home/sam/db/add-ons/vpp/lib/suse -lipsi_crypto -lipsi_osal -lipsi_pse -lipsi_ssl -lgmmd5 -lgmkernel -lgmpl -lgmrep -lgmsqlserver -lgmsqlclient -lconvert -lrtana -lglog -lgflags -lprotobuf -lre2 -lboost_timer - lnuma -lpthread -lm -lrt