2011-03-22 23 views
18

Voy a empezar diciendo que estoy casi completa muda en cuestión Cmake.target_link_libraries CMAKE no vincular mi biblioteca

Tengo el siguiente CMakeLists.txt para un proyecto Kdevelop 4.1:

project(uart) 

find_package(KDE4 REQUIRED) 
include (KDE4Defaults) 

include_directories(${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevce) 

add_subdirectory(doc) 
add_subdirectory(src) 
add_subdirectory(icons) 

link_directories(/usr/lib) 

find_library(SERIALDEVICE_LIB qserialdeviced) 

add_executable(uart ${uart_SRCS}) 
target_link_libraries(uart ${SERIALDEVICE_LIB}) 

Cuando intento para construir mi proyecto que veo:

uart/build> make -j2 
-- Found Qt-Version 4.6.3 (using /usr/bin/qmake-qt4) 
-- Found X11: /usr/lib64/libX11.so 
-- Found KDE 4.5 include dir: /usr/include/kde4 
-- Found KDE 4.5 library dir: /usr/lib64/kde4/devel 
-- Found the KDE4 kconfig_compiler4 preprocessor: /usr/bin/kconfig_compiler4 
-- Found automoc4: /usr/bin/automoc4 
CMake Error at CMakeLists.txt:16 (add_executable): 
    add_executable called with incorrect number of arguments 


CMake Error: Attempt to add link library "/usr/lib/libqserialdeviced.so" to target "uart" which is not built by this project. 
-- Configuring incomplete, errors occurred! 
make: *** [cmake_check_build_system] Error 1 
*** Failed *** 

Todo lo que leí dice que add_executable y target_link_libraries debe ser similar las últimas dos líneas de mi archivo:

add_executable(uart ${uart_SRCS}) 
target_link_libraries(uart ${SERIALDEVICE_LIB}) 

Si cambio de esas dos líneas de CMakeLists.txt dejarlo como:

project(uart) 

find_package(KDE4 REQUIRED) 
include (KDE4Defaults) 

include_directories(${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevce) 

add_subdirectory(doc) 
add_subdirectory(src) 
add_subdirectory(icons) 

link_directories(/usr/lib) 

find_library(SERIALDEVICE_LIB qserialdeviced) 

target_link_libraries(${SERIALDEVICE_LIB}) 

veo:

uart/build> make -j2 
-- Found Qt-Version 4.6.3 (using /usr/bin/qmake-qt4) 
-- Found X11: /usr/lib64/libX11.so 
-- Found KDE 4.5 include dir: /usr/include/kde4 
-- Found KDE 4.5 library dir: /usr/lib64/kde4/devel 
-- Found the KDE4 kconfig_compiler4 preprocessor: /usr/bin/kconfig_compiler4 
-- Found automoc4: /usr/bin/automoc4 
-- Configuring done 
-- Generating done 
-- Build files have been written to: uart/build 
[ 11%] Built target doc-handbook 
[ 11%] Built target uart_automoc 
Linking CXX executable uart 
CMakeFiles/uart.dir/uart.o: In function `uart::setupSerial()': 
uart/src/uart.cpp:126: undefined reference to `AbstractSerial::AbstractSerial(QObject*)' 
CMakeFiles/uart.dir/uart.o: In function `uart::setupEnumerator()': 
uart/src/uart.cpp:108: undefined reference to `SerialDeviceEnumerator::SerialDeviceEnumerator(QObject*)' 
CMakeFiles/uart.dir/uart.o: In function `uart::setupSerial()': 
uart_/uart/src/uart.cpp:136: undefined reference to `AbstractSerial::enableEmitStatus(bool)' 
CMakeFiles/uart.dir/uart.o: In function `uart::setupEnumerator()': 
uart_/uart/src/uart.cpp:112: undefined reference to `SerialDeviceEnumerator::setEnabled(bool)' 
collect2: ld returned 1 exit status 
make[2]: *** [src/uart] Error 1 
make[1]: *** [src/CMakeFiles/uart.dir/all] Error 2 
make: *** [all] Error 2 
*** Failed *** 

Eso muestra claramente que target_link_libraries no es vincular mi qserialdeviced.

qserialdeviced está en /usr/lib/libqserialdeviced.so.1.0.0, correctamente sincronizado a /usr/lib/libqserialdeviced.so y se encuentra fácilmente si lo agrego manualmente en el archivo Makefile.

obviamente me trataron:

target_link_libraries(-lqserialdeviced) 

sin cambios.

También probé:

if ("${SERIALDEVICE_LIB}" STREQUAL "SERIALDEVICE_LIB-NOTFOUND") 
    message(FATAL_ERROR "'qserialdeviced' wasn't found!") 
else() 
    message("'qserialdeviced' found: " ${SERIALDEVICE_LIB}) 
endif() 

embargo, esta prueba tiene éxito. La biblioteca se encuentra:

'qserialdeviced' found: /usr/lib/libqserialdeviced.so 

¿Alguien puede ayudarme a entender qué sucede aquí?

Estoy usando Linux Fedora 13, versión de cmake 2.8.0, gcc (GCC) 4.4.5 20101112 (Red Hat 4.4.5-2) y kdevelop-4.1.0-1.fc13.x86_64.

Gracias avanzo.


EDIT:

Como sugiere @DatChu, que divide mi CMakeLists.txt a través de mis subdirectorios y todo lo que tiene sentido para mí ahora.

Gracias a todos!

Respuesta

13

Para el archivo CMakeLists.txt original, el problema no es con target_link_libraries pero con add_executable

add_executable(uart ${uart_SRCS}) 

dónde se establece la variable de uart_SRCS? ¿Tiene

set(uart_SRCS src/blahblah.cpp src/somethingblahblah.cpp) 

Creo que es posible que malinterprete lo que add_subdirectory hace. No agrega los archivos fuente dentro.Le dice a CMake que descienda a esa carpeta y busque otro CMakeLists.txt. Normalmente lo usa cuando tiene un subproyecto dentro de la carpeta de su proyecto.

Si tiene muchos archivos de origen que no desea establecer manualmente, también se puede hacer

file(GLOB uart_SRCS src/*.cpp src/*.c) 

La desventaja es que necesita para CMake manualmente volver a ejecutar con el fin de que le permite detectar nuevos archivos . Vea el comentario de Jack sobre por qué esto podría no ser lo que quiere usar.

Su CMakeLists.txt será muy probablemente

project(uart) 

find_package(Qt4 REQUIRED) 
include (${QT_USE_FILE}) 
find_package(KDE4 REQUIRED) 
include (KDE4Defaults) 

include_directories(${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevice) 
link_directories(/usr/lib) 

file(GLOB uart_SRCS src/*.cpp src/*.h) 
file(GLOB uart_HDRS include/*.h include/QSerialDevice/*.h) 

find_library(SERIALDEVICE_LIB qserialdeviced) 

add_executable(uart ${uart_SRCS} ${uart_HDRS}) 
target_link_libraries(uart ${SERIALDEVICE_LIB} ${QT_LIBRARIES}) 
+0

No, no me he fijado, pero trató de hacer algo como 'add_executable (UART src/main.cpp src/uart.cpp ...) '. Paré porque no encuentro mucho más inteligente para repetir los nombres de todos los archivos fuente después de 'add_subdirectory (src)'. ¿Hay una mejor manera de hacer esto? Debo mencionar que tenía errores incluso cuando intenté agregar todos los archivos ".cpp" manualmente. Si quieres, puedo poner el error en mi publicación. Gracias. – j4x

+0

Si pudiera actualizar el CMakeLists.txt original con lo que tiene ahora + los archivos en su proyecto, puedo sugerirle lo que necesita para CMake –

+7

Por favor, no recomiende el uso de 'file (GLOB ...)': http://www.cmake.org/pipermail/cmake/2010-July/037984.html y http://www.cmake.org/pipermail/cmake/2010-September/039562.html –

Cuestiones relacionadas