[cmake] CMake target_include_directories 범위의 의미

키워드 PUBLIC, 의 의미는 무엇이며 CMake PRIVATEINTERFACE관련이 target_include_directories있습니까?



답변

이러한 키워드는 대상에 전달하는 포함 디렉터리 목록이 필요한 시기 를 알려주는 데 사용됩니다 . 으로 할 때 , 사람들은 디렉토리가 필요 포함 할 경우 그 의미 :

  • 해당 타겟 자체를 컴파일합니다.
  • 해당 대상에 의존하는 다른 대상을 컴파일합니다 (예 : 공용 헤더 사용).
  • 위의 두 상황 모두에서.

CMake가 대상을 컴파일 할 때, 그것은 대상 사용 INCLUDE_DIRECTORIES, COMPILE_DEFINITIONSCOMPILE_OPTIONS특성을. PRIVATEin target_include_directories()and alike 키워드 를 사용할 때 CMake에 해당 대상 속성을 채우도록 지시합니다.

CMake가 대상 A와 다른 대상 B 간의 종속성을 감지하면 (예 : target_link_libraries(A B)명령 을 사용할 때 ) B 사용 요구 사항A대상에 전 이적으로 전파 합니다 . 이러한 대상 사용 요구 사항 은 종속 된 모든 대상이 B충족해야하는 포함 디렉터리, 컴파일 정의 등입니다 . INTERFACE_*위에 나열된 속성 의 버전 (예 INTERFACE_INCLUDE_DIRECTORIES:)에 의해 지정 INTERFACE되며 target_*()명령을 호출 할 때 키워드 를 사용하여 채워집니다 .

PUBLIC키워드는 대략 의미한다 PRIVATE + INTERFACE.

따라서 A일부 Boost 헤더를 사용 하는 라이브러리 를 생성한다고 가정합니다 . 당신은 할 것입니다 :

  • target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})소스 파일 ( .cpp) 또는 개인 헤더 파일 ( .h) 내에서만 해당 Boost 헤더를 사용하는 경우 .
  • target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})소스 파일 내에서 해당 Boost 헤더를 사용하지 않는 경우 (따라서 컴파일 할 필요가 없습니다 A). 실제로 이것에 대한 실제 사례를 생각할 수 없습니다.
  • target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})일부 A소스 파일에 모두 포함되어 있으며 A라이브러리의 다른 클라이언트에도 포함될 수 있는 공용 헤더 파일에서 이러한 Boost 헤더를 사용하는 경우 .

CMake 3.0 문서에는이 빌드 사양 및 사용 요구 사항 속성 에 대한 자세한 내용이 있습니다.


답변

다음 인수의 범위를 지정하려면 INTERFACE, PUBLIC 및 PRIVATE 키워드가 필요합니다. PRIVATE 및 PUBLIC 항목은 <target>의 INCLUDE_DIRECTORIES 속성을 채 웁니다. PUBLIC 및 INTERFACE 항목은 <target>의 INTERFACE_INCLUDE_DIRECTORIES 속성을 채 웁니다. 다음 인수는 포함 디렉터리를 지정합니다.

문서에서 : http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html

내 말로 문서를 바꾸려면 :

  • 대상에 대한 포함 디렉토리 목록에 디렉토리를 추가하려는 경우
  • PRIVATE를 사용하면 디렉토리가 대상의 포함 디렉토리에 추가됩니다.
  • INTERFACE를 사용하면 대상이 수정되지 않지만 INTERFACE_INCLUDE_DIRECTORIES는 디렉토리에 의해 확장됩니다. 변수는 라이브러리에 대한 공용 포함 디렉토리 목록입니다.
  • PUBLIC을 사용하면 PRIVATE 및 INTERFACE의 두 작업이 모두 수행됩니다.


답변