2011-03-22 6 views
18

나는 Cmake 문제에서 거의 완전 바보라는 말을하기 시작할 것입니다.Cmake target_link_libraries가 내 라이브러리를 연결하지 않음

내가 가지고는 A Kdevelop 4.1 프로젝트에 대한 CMakeLists.txt을 다음

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}) 

내 프로젝트를 빌드 할 때 나는 참조 : 내가 읽은

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 *** 

모든 add_executabletarget_link_libraries 모양을해야한다고 말한다 내 파일의 마지막 두 줄 :

add_executable(uart ${uart_SRCS}) 
target_link_libraries(uart ${SERIALDEVICE_LIB}) 
내가로 떠나는 CMakeLists.txt의 두 라인을 변경하는 경우3210

는 :

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}) 

나는 참조 : target_link_librariesqserialdeviced 연결되지 않도록

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 *** 

명확하게 보여줍니다.

qserialdeviced/usr/lib/libqserialdeviced.so으로 정확하게 연결되어 있으며 수동으로 Makefile에 추가하면 쉽게 찾을 수 있습니다.

가 나는 분명히 시도 : 변화없이

target_link_libraries(-lqserialdeviced) 

.

는 또한 시도 :

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

그러나이 테스트가 성공합니다. 라이브러리를 찾았습니다 :

아무도 도와 줄 수 없습니까?

저는 Linux Fedora 13, cmake 버전 2.8.0, gcc (GCC) 4.4.5 20101112 (Red Hat 4.4.5-2) 및 kdevelop-4.1.0-1.fc13.x86_64를 사용하고 있습니다.

감사드립니다.


편집 :

@DatChu에 의해 제안

, 나는 내 하위 디렉토리와 모든 걸쳐 CMakeLists.txt 지금 나에게 의미가 분할합니다.

감사합니다. everbody!

원래 CMakeLists.txt 파일의 경우

답변

13

, 문제가 target_link_libraries로하지만,하지입니다 add_executable 당신이 당신의 uart_SRCS 변수를 설정 않았다

add_executable(uart ${uart_SRCS}) 

? Do you have

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

add_subdirectory가하는 일을 오해 할 수도 있습니다. 소스 파일을 내부에 추가하지 않습니다.그것은 CMake에게 그 폴더로 내려 가서 다른 CMakeLists.txt를 찾도록 지시합니다. 일반적으로 프로젝트 폴더 내에 하위 프로젝트가있을 때이 옵션을 사용합니다.

당신이 수동으로 설정하지 않는 많은 소스 파일이있는 경우, 당신은 또한 단점이 새로운 파일을 검색하는 수동 위해 CMake를 다시 실행해야 할 것입니다

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

을 수행 할 수 있습니다 . 이것이 왜 당신이 사용하기 원하는 것이 아닐지에 대한 Jack의 코멘트를보십시오.

귀하의 CMakeLists.txt은 대부분

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

아니, 내가 그것을 설정하지 않은,하지만'add_executable UART (SRC/MAIN.CPP의 SRC/uart.cpp 그런 짓을하려고합니다 ...)'. 나는'add_subdirectory (src)'이후에 모든 소스 파일의 이름을 반복하는 것이별로 좋지 않기 때문에 중단했다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 나는 모든 ".cpp"파일을 수동으로 추가하려고 할 때에도 에로트를 언급해야합니다. 원한다면 실수로 내 게시물에 넣을 수 있습니다. 감사. – j4x

+0

원본 CMakeLists.txt 파일을 프로젝트의 파일들과 함께 업데이트 할 수 있다면 CMake에 필요한 것을 제안 할 수 있습니다 –

+7

'file (GLOB ...) '을 사용하지 마십시오 : http://www.cmake.org/pipermail/cmake/2010-July/037984.html 및 http://www.cmake.org/pipermail/cmake/2010-September/039562.html –

관련 문제