저는 CMake를 처음 사용하며 target_link_libraries()
. 문서에는 하나의 명령으로 링크 종속성과 링크 인터페이스를 모두 지정하는 데 사용할 수 있다고 언급되어 있습니다.
링크 종속성 및 링크 인터페이스는 실제로 무엇을 의미합니까?
저는 CMake를 처음 사용하며 target_link_libraries()
. 문서에는 하나의 명령으로 링크 종속성과 링크 인터페이스를 모두 지정하는 데 사용할 수 있다고 언급되어 있습니다.
링크 종속성 및 링크 인터페이스는 실제로 무엇을 의미합니까?
답변:
공유 라이브러리와 소스 cpp 파일을 #include 다른 라이브러리 (예 : QtNetwork)의 헤더를 포함하지만 헤더 파일에 QtNetwork 헤더가 포함되지 않은 경우 QtNetwork는 PRIVATE
종속성입니다.
소스 파일과 헤더에 다른 라이브러리의 헤더가 포함되어 있으면 PUBLIC
종속성입니다.
소스 파일이 아닌 헤더 파일에 다른 라이브러리의 헤더가 포함되어 있으면 INTERFACE
종속성입니다.
의 다른 빌드 속성 PUBLIC
및 INTERFACE
종속성은 사용 라이브러리로 전파됩니다. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements
PUBLIC
하거나 PRIVATE
중요한 이유는 무엇입니까? 무엇이 바뀌나요?
PRIVATE
라이브러리에 연결된 프로젝트에 종속성이 추가되지 않습니다. 더 깨끗하고 종속성과 사용자 간의 충돌 가능성을 방지합니다.
PUBLIC
종속성이 없습니다. INTERFACE
의존성.
@steveire 허용 답변은 훌륭합니다. 차이점을 빠르게 확인하기 위해 표를 추가하고 싶었습니다.
.-----------.------------------.----------------.
| | Linked by target | Link interface |
:-----------+------------------+----------------:
| PUBLIC | X | X |
:-----------+------------------+----------------:
| PRIVATE | X | |
:-----------+------------------+----------------:
| INTERFACE | | X |
'-----------'------------------'----------------'
일부 답변은 PRIVATE / PUBLIC / INTERFACE를 사용할 때만 언급되었지만 영향은 무시됩니다. 참조 : CMake-Public-Private-Interface
PUBLIC PUBLIC
다음의 모든 개체는 현재 대상에 연결하고 현재 대상에 종속 된 다른 대상에 인터페이스를 제공하는 데 사용됩니다.
PRIVATE PRIVATE 이후의
모든 개체는 현재 대상에 연결하는 데만 사용됩니다.
INTERFACE INTERFACE를
따르는 모든 개체는 현재 대상에 종속 된 다른 대상에 인터페이스를 제공하는 데만 사용됩니다.