[cmake] CMake target_link_libraries 인터페이스 종속성

저는 CMake를 처음 사용하며 target_link_libraries(). 문서에는 하나의 명령으로 링크 종속성과 링크 인터페이스를 모두 지정하는 데 사용할 수 있다고 언급되어 있습니다.

링크 종속성 및 링크 인터페이스는 실제로 무엇을 의미합니까?



답변

공유 라이브러리와 소스 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


답변

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

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


답변

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

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

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

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


답변