키워드 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
. target_include_directories(libname INTERFACE include PRIVATE include/libname)
. 즉, 라이브러리 내에 파일을 직접 포함 할 수 있지만 라이브러리 사용자는 libname/
먼저 삽입해야합니다 .
target_include_directories()
실행 파일이 사용하는 헤더 파일을 찾을 포함 디렉터리를 설정해야하는 경우 실행 가능한 대상을 호출 할 수 있습니다 (예 : Boost :: Program_options, main()
함수 에서 인수를 구문 분석하는 데 사용하는 경우 ). . PRIVATE
이 파일은 실행 파일 자체를 컴파일하는 데 필요하므로이 경우 키워드를 사용할 수 있습니다. 몇 가지 사용이 나도 몰라 INTERFACE
또는 PUBLIC
실행에하지만.
다음 인수의 범위를 지정하려면 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
내 말로 문서를 바꾸려면 :