2011-04-12 5 views
13

나는 CMake에 새롭다. 사실, 나는 그것을 통해 Kdevelop4 widh C + +를 시도하고있다.CMake 하위 디렉토리 종속성

모든 소스를 컴파일하여 단일 실행 파일로 링크해야한다고해도 필자가 만든 모든 네임 스페이스에 대한 하위 디렉토리를 만드는 습관이 있습니다. 글쎄, kdevelop 아래에 디렉토리를 만들면 CMakeLists.txt가 add_subdirectory 명령으로 업데이트되고 그 아래에 새로운 CMakeLists.txt가 생성되지만, 그 아래의 소스는 컴파일 목록에 추가되지 않습니다.

 

project(gear2d) 

add_executable(gear2d object.cc main.cc) 

add_subdirectory(component) 

구성 요소에서/내가 컴파일하고 gear2d 실행 파일을 생성하는 링크 될하고자하는 소스가 다음과 같이

나는 루트 CMakeLists.txt 있습니다. 어떻게해야합니까?

CMake FAQ는 this 항목을 가지고 있지만 그 대답은 차라리 평범한 Makefile에 머물고 싶습니다.

이 방법이 있습니까?

답변

15

하위 디렉토리를 추가해도 CMake에 디렉토리를 입력하고 거기에 또 다른 CMakeLists.txt가 있는지 확인하는 것 이상을 수행하지 않습니다. 소스 파일이 add_library 인 라이브러리를 만들고 실행 파일에 target_link_libraries으로 링크해야합니다. 다음과 같은 뭔가 :

하위 디렉터리 CMakeLists.txt

set(component_SOURCES ...) # Add the source-files for the component here 
# Optionally you can use file glob (uncomment the next line) 
# file(GLOB component_SOURCES *.cpp)below 

add_library(component ${component_SOURCES}) 

에서 최상위 디렉토리를했던 그 CMakeLists.txt

project(gear2d) 
add_subdirectory(component) 
add_executable(gear2d object.cc main.cc) 
target_link_libraries(gear2d component) 
+0

! 매우 감사합니다. 나는 라이브러리가 무엇을 의미하는지에 대한 다른 개념을 가지고있었습니다. 실제로 add_executable을 사용하여 서브 디렉토리 CMakeListrs.txt에 소스를 추가하는 것만 큼 루트 디렉토리에서했던 것처럼합니다. 다시 한번 감사드립니다. – Leonardo

+0

기본적으로 새 (라이브러리) 대상이 추가됩니다. 이 타겟이 자체적으로 링크되지는 않지만 나중에 컴파일러 플래그 또는 기타 항목을 설정할 때 문제가 발생할 수 있습니다. 더 나은 대답은 다음과 같습니다. http://stackoverflow.com/questions/8934295/add-source-in -a-sub-directory-to-a-cmake-project – kralyk

+0

@kralyk : 새 라이브러리 타겟에 동의합니다. 편의를 위해 필자는 "단일 실행 파일에 링크 된"을 보았을 뿐이며 디렉토리와 라이브러리에 소스 파일을 배포하는 또 다른 방법을 간단히 알고 싶었습니다. –