CMake target_include_directories 범위의 의미


답변:


125

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

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

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 문서에는이 빌드 사양 및 사용 요구 사항 속성 에 대한 자세한 내용이 있습니다.


18
의 실제 예와 관련하여 INTERFACE. target_include_directories(libname INTERFACE include PRIVATE include/libname). 즉, 라이브러리 내에 파일을 직접 포함 할 수 있지만 라이브러리 사용자는 libname/먼저 삽입해야합니다 .
KaareZ

2
이 답변은 라이브러리를 만드는 데 의미가 있습니다. 그러나 실행 가능한 대상에 대해 target_include_directories를 호출하는 것은 어떻습니까?
Norman Pellet

1
@NormanPellet : target_include_directories()실행 파일이 사용하는 헤더 파일을 찾을 포함 디렉터리를 설정해야하는 경우 실행 가능한 대상을 호출 할 수 있습니다 (예 : Boost :: Program_options, main()함수 에서 인수를 구문 분석하는 데 사용하는 경우 ). . PRIVATE이 파일은 실행 파일 자체를 컴파일하는 데 필요하므로이 경우 키워드를 사용할 수 있습니다. 몇 가지 사용이 나도 몰라 INTERFACE또는 PUBLIC실행에하지만.
TManhente

13

다음 인수의 범위를 지정하려면 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의 두 작업이 모두 수행됩니다.

5
CMAKE 문서를 살펴 보았지만 실제로 의미하는 바가 무엇이며 어떤 맥락에서 (파일을 만들거나 어떻게 컴파일하는지) 이해하지 못했습니다.
Sirish

@Sirish : 문서를 바꾸려고했는데 도움이 되길 바랍니다.
usr1234567 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.