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


134

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

|
|->include
|->src

내 코드에 대한 CMakeLists.txt 파일을 작성 중입니다. 나는 사이의 차이를 이해하려면 include_directories와 target_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, PUBLIC및 INTERFACE한정자.


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_directories과 target_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.