2009-08-13 14 views
8

Cuando intento para construir este proyecto con cmake y gcc en un sistema Linux de 64 bits (debian) de la máquina, me sale un error del vinculador:proyecto de construcción que implica cmake, como creo que consciente de las bibliotecas

Linking C executable ../../../../cpsadamsx 
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlopen' 
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlclose' 
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlerror' 
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlsym' 
collect2: ld returned 1 exit status 
make[2]: *** [cpsadamsx] Error 1 
make[1]: *** [sundials/examples/cpodes/serial/CMakeFiles/cpsadamsx.dir/all] Error 2 
make[1]: *** Waiting for unfinished jobs.... 

Aparentemente dlopen, dlclose, dlerror y dlsym son referencias a libdl.so. Tengo esa biblioteca en /lib64/libdl.so.2, pero ¿por qué no se encuentra?

Hubiera sido un './configure normal; hacer; hacer install'-ruta que podría haber establecido la variable LIBS y emitió el comando configure como esto (creo):

export LIBS=-ldl && ./configure 

Pero, ¿qué hago ahora?

ACTUALIZACIÓN:

por lo que parece que el (o al menos una) se encuentra la biblioteca, pero no contiene los símbolos en cuestión. Tal vez lo intente con la biblioteca de 32 bits en/lib?

¿Hay alguna manera de desensamblar /lib64/libdl.so.2 para asegurarse de que tiene las referencias dlopen, etc.?

El problema ahora parece guiar las herramientas de compilación a la versión correcta de la biblioteca.

Respuesta

1

Probablemente es necesario agregar target_link_libraries() - ver link text

+0

que podría funcionar, pero no es "mi" proyecto, por lo que preferentemente no quiero editar los archivos CMakeLists.txt. – dala

1

Añadir esto en CMakeLists.txt y debería funcionar:

SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ldl") 
+2

Esto es específico de Linux, y no es la mejor solución; consulte la referencia a CMAKE_DL_LIBS anterior. – ideasman42

25

Como esta pregunta está apareciendo en Google y en las dos respuestas ganaron' Apunte a la solución correcta aquí:

En su CMakeLists.txt agregue ${CMAKE_DL_LIBS} para enlazar con idl. Debe tener un aspecto similar a este:

target_link_libraries(ExpandableTest 
    ${CMAKE_DL_LIBS} 
    Expandable 
    ExpandableTestLibrary 
) 
+0

Esta es la versión más compatible, debería ser la aceptada. –

+1

Quiero agregar que tuve que mover $ {CMAKE_DL_LIBS} a la última posición dentro de la lista. De lo contrario, no funcionó para mí – Anonymous

Cuestiones relacionadas