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_directoriesCMake 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? 그들 사이의 차이점에 대해 이해하지 못하는 것은 무엇입니까?