2011-08-03 6 views
59

필자는 디렉토리를 PHP의 Java 또는 디렉토리에서 패키지를 사용하는 방법과 같은 조직 구성 요소로 사용하는 C++ 프로젝트를 보유하고 있습니다. 디렉토리는 자급 자족 할 수있는 요소가 아니라 프로젝트 전체를 구성하고 소스로 인해 압도 당하지 않도록하는 방법입니다. CMakeLists.txt 파일을 어떻게 처리 할 수 ​​있습니까? 디렉토리 라이브러리를 만드는 것은 여기에 맞지 않는 것처럼 보입니다. 왜냐하면 그것들은 모두 상호 의존적이며 그런 방식으로 사용되도록 의도되지 않았기 때문입니다.상호 의존적 인 여러 하위 디렉토리로 C++ 프로젝트를 빌드하려면 어떻게해야합니까?

관련 문제로, CMake에서 여러 하위 디렉토리를 본 대부분의 예는 그 중 많은 부분을 제외하고는 include_directories 설정 문제를 무시하거나 글로 나타내 었으며 이는 문제가 생겼다. 어떤 파일이 어떤 디렉토리에 종속되어 있는지를 결정하기 위해 내 소스 파일을 빗질하는 것 말고는 어쨌든 /src/ 아래의 모든 디렉토리를 잠재적 인 디렉토리로 설정하고 CMake가 실제로 의존하는 파일을 찾도록합니다.

--src 
    --top1 
    --mid1 
     --bot1 
     --src1.cpp 
     --hdr1.h 
     --bot2 
     --src2.cpp 
     --hdr2.h 
    --mid2 
     --bot3 
     --src3.cpp 
     --src4.cpp 
     --hdr3.h 
    --top2 
    --mid3 
     --src5.cpp 
     --hdr4.h 

등등 등등 :

다음은 구성 예입니다. 이러한 종류의 구조를 처리하기 위해 내 CMakeLists.txt 파일을 어떻게 구조화 할 수 있습니까?

+1

절대적으로 CMake를 사용해야합니까? –

+0

1.) 선호하는 발전기로 일하고 있습니까? 2.) 정말로 CMake가 무엇에 의존하는지 알아 내야한다고 생각합니까? 서로 독립적이어야하는 모듈 (예 : mid1, mid2, top2)을 정의 할 수 있어야한다고 생각합니다. 3.) "hdr2.h"또는 와 같은 것을 # 포함합니까? – Philipp

+0

@benoit 그렇지 않겠지 만, 그게 내가 현재 사용하고있는 것입니다. 필자는 Automake를 사용하지 않고, 빌드가 복잡하지 않을 때 빌드 시스템을 배우는 데 많은 노력을 기울이는 것처럼 보입니다. –

답변

50

프로젝트의 디렉토리 구조가 파일을 구성하는 데있어 단지 하나의 방법은 디렉토리에있는 모든 소스 파일을 자동으로 찾고 모든 디렉토리를 헤더 파일이있는 포함 디렉토리로 추가하는 것입니다 그들 안에. 다음 CMake 파일은 출발점이 될 수 있습니다

cmake_minimum_required(VERSION 3.0) 

project (Foo) 

file(GLOB_RECURSE Foo_SOURCES "src/*.cpp") 
file(GLOB_RECURSE Foo_HEADERS "src/*.h") 

set (Foo_INCLUDE_DIRS "") 
foreach (_headerFile ${Foo_HEADERS}) 
    get_filename_component(_dir ${_headerFile} PATH) 
    list (APPEND Foo_INCLUDE_DIRS ${_dir}) 
endforeach() 
list(REMOVE_DUPLICATES Foo_INCLUDE_DIRS) 

add_executable (FooExe ${Foo_SOURCES}) 
target_include_directories(FooExe PRIVATE ${Foo_INCLUDE_DIRS}) 

file(GLOB_RECURSE ... 명령은 소스와 헤더 파일의 세트를 결정합니다. foreach 루프는 모든 헤더 파일 목록에서 포함 디렉터리 집합을 계산합니다.

소스 파일 집합을 계산할 때의 단점은 새 파일이 원본 트리에 추가 될 때 CMake가 자동으로 검색하지 않는다는 것입니다. 수동으로 빌드 파일을 다시 만들어야합니다.

+0

나는 비슷한 것을 시도했지만 다른 include_directories 로직 (비참하게 실패했다.)을 사용했다. 나는 이걸 줄거야. –

+15

고맙습니다! 나는 이것을 찾기가 너무 어려웠다는 것을 짐작할 수 없다 - 하위 디렉토리에 소스 파일을 구성하는 사람이 아무도 없습니까? – Cygon

+2

@Cygon - 분명히 아닙니다. :-) –

2

나는 CMake에 대한 전문가가 아니지만 다른 대답이 없기 때문에 나는 documentaton을 살펴보고 그것들을 시도 할 것이다. 다른 디렉토리에 소스 및 파일을 구성하는 것은 거의 표준입니다. http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:include_directories

그래서 같은 것을 :이 헤더 파일을 찾을 수 있도록이 컴파일러에 전달되는

include_directories("src/top1/mid1/bot1" "src/top1/mid1/bot2/" ...) 

것 그것은 CMake처럼 보이는

는 디렉토리를 포함 당신이 목록을 제공 할 수 있습니다 각 소스 파일에 대해 전달되어야합니다. 따라서 어떤 소스 파일이라도 헤더 파일을 포함 할 수 있어야합니다 (내가 생각하는 것). 그와 마찬가지로

당신은 add_executable 명령의 모든 소스 파일을 나열 할 수 있어야한다 :

add_executable(name "src/top1/mid1/bot1/src1.cpp" "src/top1/id1/bot2/src2.cpp" ...) 

그래서이 구축 모든 것을 얻기의 순진한 방법이 될 것입니다. 각 소스 파일은 컴파일되어 모든 디렉토리에서 헤더를 찾은 다음 오브젝트 파일이 함께 링크됩니다. 폴더를 많이 포함 할 필요가 없도록 단순화하는 방법이 있다면 고려해보십시오. 아마도 모든 소스 파일에서 참조해야하는 몇 가지 공통 헤더 파일 만있을 수 있습니다. 일이 더 복잡해지면 하위 계층 구조를 라이브러리 등으로 빌드 할 수 있습니다. 또한 소스 파일과 헤더를 분리하는 것을 고려하십시오 (예 : src 및 include 포함).

관련 문제