CMake에서 include_directories와 target_include_directories의 차이점은 무엇입니까?


134

C ++ 코드의 디렉토리 구조는 다음과 같습니다.

|
|->include
|->src

내 코드에 대한 CMakeLists.txt 파일을 작성 중입니다. 나는 사이의 차이를 이해하려면 include_directoriestarget_include_directories의를 CMake.

사용법과 차이점 중 포함 파일 경로를 추가하기 위해 어떤 차이가 있습니까?


4
당신은에 대한 설명서 읽고 include_directories과를 target_include_directories? 그들 사이의 차이점에 대해 이해하지 못하는 것은 무엇입니까?
일부 프로그래머 친구

74
설명서에는 명확성이 없습니다. 나는 그것을 읽고 Angew가 그의 대답에 쓴 것을 추측했지만 CMake 문서에는 설명, 예제 및 프로젝트 작성을위한 시스템이 없으며 프로젝트 기반 예제는 없습니다. CMake에 대한 훌륭하고 철저한 문서가 있었지만 이러한 질문으로 커뮤니티에 부담을주지 않았을 것입니다.
Ujjwal Aryan

cmake의 개념은 제대로 문서화되지 않았습니다. 특히 타겟팅하고 '타겟팅되지 않은'.
John Greene

답변:


148

include_directories(x/y)디렉토리 범위에 영향을줍니다. 이 CMakeList의 모든 대상과 호출 시점 이후에 추가 된 모든 서브 디렉토리 x/y의 대상에는 포함 경로에 경로가 추가됩니다.

target_include_directories(t x/y)대상 범위 – target x/y의 포함 경로에 추가 합니다 t.

모든 대상이 해당 include 디렉토리를 사용하는 경우 전자를 원합니다. 경로가 대상에 따라 다르거 나 경로의 가시성을보다 세밀하게 제어하려는 경우 후자를 원합니다. 후자는 사실에서 오는 target_include_directories()지지체 PRIVATE, PUBLICINTERFACE한정자.


35
나는 cmake 3을 사용하는 한 후자가 일반적으로 선호되어야한다고 생각합니다. 명령에 x/y사용 t되는 종속 대상의 포함 경로 를 넣는 이점 이 있습니다 target_link_libraries. 물론 전자를위한 장소가 있지만 나는 후자가 일반적으로 더 낫다고 믿는다.
Phil

2
원래 답변에 따르면 이후에 추가 된 대상 및 하위 디렉토리 만 include_directories영향을받습니다. 답을 편집 중입니다. 문서 에 현재 CMakeLists의 모든 대상이 영향을받는다고 명시되어 있습니다. 문서에는 언급되지 않았지만 호출 후 영향을받은 하위 디렉토리 만 언급되었습니다 (원래 답변에 올바르게 언급 된대로)
tamas.kenez

@Phil은 target_include_directoriesCMake 2.8.11 (2013 년 5 월)에 도입 된
tamas.kenez

@ tamas.kenez이 문제를 해결해 주셔서 감사합니다. 나는 그것이 "지금부터"일이라고 확신했다.
Angew는 더 이상 SO

40

무엇 옆 문헌 : Angew의 대답은 제대로하는 것이 말했다 사이에 또 다른 매우 중요한 차이점 include_directoriestarget_include_directories그 인과 함께 사용했을 때 PUBLIC또는 INTERFACE, 후자 채우는 INTERFACE_INCLUDE_DIRECTORIES대상의 속성입니다. target_link_libraries연결 대상에 자동으로 추가 된 디렉토리가 포함되므로이 속성은 다른 대상 이 원래 대상에 연결하는 데 사용할 때 유용합니다 . 예를 참조하십시오 .

이 중요한 기능은 꽤 잘 문서에 숨겨져 : target_include_directories는 채우기 언급 INTERFACE_INCLUDE_DIRECTORIES누구의 문서를 말한다를 :

target_link_libraries ()를 사용하여 대상 종속성을 지정하면 CMake는 모든 대상 종속성에서이 속성을 읽어 소비자의 빌드 속성을 결정합니다.


내가 PUBLIC등의 속성에 대한 이해하기 쉬운 설명을 읽은 것은 이번이 처음입니다 ! 감사합니다 : D
RL-S

2

@ Angew가 말했듯이, 가장 큰 차이점은 다음과 같습니다.

1, 소스 트리 2의 모든 파일에 대해 include_directories ()에 액세스 할 수 있고, 컴파일 할 때 특정 대상에 대해서만 target_include_directories ()에 액세스 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.