키워드 PUBLIC
, 의 의미는 무엇이며 CMake PRIVATE
와 INTERFACE
관련이 target_include_directories
있습니까?
답변
이러한 키워드는 대상에 전달하는 포함 디렉터리 목록이 필요한 시기 를 알려주는 데 사용됩니다 . 으로 할 때 , 사람들은 디렉토리가 필요 포함 할 경우 그 의미 :
- 해당 타겟 자체를 컴파일합니다.
- 해당 대상에 의존하는 다른 대상을 컴파일합니다 (예 : 공용 헤더 사용).
- 위의 두 상황 모두에서.
CMake가 대상을 컴파일 할 때, 그것은 대상 사용 INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
및 COMPILE_OPTIONS
특성을. PRIVATE
in 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의 두 작업이 모두 수행됩니다.