CMake target_link_libraries 인터페이스 종속성


답변:


211

공유 라이브러리와 소스 cpp 파일을 #include 다른 라이브러리 (예 : QtNetwork)의 헤더를 포함하지만 헤더 파일에 QtNetwork 헤더가 포함되지 않은 경우 QtNetwork는 PRIVATE종속성입니다.

소스 파일과 헤더에 다른 라이브러리의 헤더가 포함되어 있으면 PUBLIC종속성입니다.

소스 파일이 아닌 헤더 파일에 다른 라이브러리의 헤더가 포함되어 있으면 INTERFACE종속성입니다.

의 다른 빌드 속성 PUBLICINTERFACE종속성은 사용 라이브러리로 전파됩니다. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements


43
이것은 내가 들어 본 질문에 대한 가장 명확한 설명입니다. cmake 문서 가 명확 했으면 좋겠습니다 ! :-)
Ela782

1
설명을 해주셔서 감사합니다. 이제 의미를 이해했지만 지정 PUBLIC하거나 PRIVATE중요한 이유는 무엇입니까? 무엇이 바뀌나요?
user3667089

9
를 사용하면 PRIVATE라이브러리에 연결된 프로젝트에 종속성이 추가되지 않습니다. 더 깨끗하고 종속성과 사용자 간의 충돌 가능성을 방지합니다.
user2658323 17:29에

7
@steveire 명확성을 위해 "포함"은 직접적인 포함이 아니라 전 이적 포함을 의미한다고 명시 적으로 언급 할 가치가 있습니다. 예를 들어 다른 라이브러리의 헤더 파일이 헤더 파일에 의해 직접 포함되지만 모든 헤더 파일이 소스 파일에 포함 된 경우 소스 파일은 다른 라이브러리의 헤더 파일을 전 이적으로 포함하므로 PUBLIC종속성이 없습니다. INTERFACE의존성.
Ose

cmake 문서는이 답변만큼 간결하게 작성해야합니다!
브라이언 JYH Herng 종

4

@steveire 허용 답변은 훌륭합니다. 차이점을 빠르게 확인하기 위해 표를 추가하고 싶었습니다.

.-----------.------------------.----------------.
|           | Linked by target | Link interface |
:-----------+------------------+----------------:
| PUBLIC    |        X         |        X       |
:-----------+------------------+----------------:
| PRIVATE   |        X         |                |
:-----------+------------------+----------------:
| INTERFACE |                  |        X       |
'-----------'------------------'----------------'
  • Linked by target : 대상 소스에 포함 된 라이브러리 (라이브러리를 연결하는 프로젝트에 대한 종속성 아님).
  • 링크 인터페이스 : 대상 공개 헤더에 포함 된 라이브러리 (라이브러리를 연결하는 프로젝트에 대한 종속성).

0

일부 답변은 PRIVATE / PUBLIC / INTERFACE를 사용할 때만 언급되었지만 영향은 무시됩니다. 참조 : CMake-Public-Private-Interface

PUBLIC PUBLIC
다음의 모든 개체는 현재 대상에 연결하고 현재 대상에 종속 된 다른 대상에 인터페이스를 제공하는 데 사용됩니다.

PRIVATE PRIVATE 이후의
모든 개체는 현재 대상에 연결하는 데만 사용됩니다.

INTERFACE INTERFACE를
따르는 모든 개체는 현재 대상에 종속 된 다른 대상에 인터페이스를 제공하는 데만 사용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.