C ++ 코드의 디렉토리 구조는 다음과 같습니다.
|
|->include
|->src
내 코드에 대한 CMakeLists.txt 파일을 작성 중입니다. 나는 사이의 차이를 이해하려면 include_directories
와 target_include_directories
의를 CMake
.
사용법과 차이점 중 포함 파일 경로를 추가하기 위해 어떤 차이가 있습니까?
C ++ 코드의 디렉토리 구조는 다음과 같습니다.
|
|->include
|->src
내 코드에 대한 CMakeLists.txt 파일을 작성 중입니다. 나는 사이의 차이를 이해하려면 include_directories
와 target_include_directories
의를 CMake
.
사용법과 차이점 중 포함 파일 경로를 추가하기 위해 어떤 차이가 있습니까?
답변:
include_directories(x/y)
디렉토리 범위에 영향을줍니다. 이 CMakeList의 모든 대상과 호출 시점 이후에 추가 된 모든 서브 디렉토리 x/y
의 대상에는 포함 경로에 경로가 추가됩니다.
target_include_directories(t x/y)
대상 범위 – target x/y
의 포함 경로에 추가 합니다 t
.
모든 대상이 해당 include 디렉토리를 사용하는 경우 전자를 원합니다. 경로가 대상에 따라 다르거 나 경로의 가시성을보다 세밀하게 제어하려는 경우 후자를 원합니다. 후자는 사실에서 오는 target_include_directories()
지지체 PRIVATE
, PUBLIC
및 INTERFACE
한정자.
x/y
사용 t
되는 종속 대상의 포함 경로 를 넣는 이점 이 있습니다 target_link_libraries
. 물론 전자를위한 장소가 있지만 나는 후자가 일반적으로 더 낫다고 믿는다.
include_directories
영향을받습니다. 답을 편집 중입니다. 문서 에 현재 CMakeLists의 모든 대상이 영향을받는다고 명시되어 있습니다. 문서에는 언급되지 않았지만 호출 후 영향을받은 하위 디렉토리 만 언급되었습니다 (원래 답변에 올바르게 언급 된대로)
target_include_directories
CMake 2.8.11 (2013 년 5 월)에 도입 된
무엇 옆 문헌 : 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
include_directories
과를target_include_directories
? 그들 사이의 차이점에 대해 이해하지 못하는 것은 무엇입니까?