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!
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
Si pudiera actualizar el CMakeLists.txt original con lo que tiene ahora + los archivos en su proyecto, puedo sugerirle lo que necesita para CMake –
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 –