我写了一个小的测试项目来理解PRIVATE
关键字在cmake的target_link_libraries()
函数中是如何工作的。我们有一个main目标,它链接到第一个库lib1,而这个第一个库又链接到第二个库lib2。依赖关系的传递处理在任何情况下都是PRIVATE
。所以我期望main只能访问lib1的函数,同样lib1只能访问lib2的函数(见下面的图表和代码)。现在在main中,我们直接从lib2调用一个函数。然而,项目链接和执行正常,所以我没有得到它。
更详细地说,我认为target_link_libraries(lib1 PRIVATE lib2)
将lib1的属性填充为LINK_LIBRARIES=lib2
,target_link_libraries(main PRIVATE lib1)
将main的属性填充为LINK_LIBRARIES=lib1
,但lib1的INTERFACE_LINK_LIBRARY
属性未设置为lib2,因此将main与lib1链接不会使lib2可供main访问。
文件夹结构
project(dependency_propagation) cmake_minimum_required(VERSION 3.0)
add_library(lib1 src1.cpp) add_library(lib2 src2.cpp)
target_include_directories(lib1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/includes) target_include_directories(lib2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/includes)
target_link_libraries(lib1 PRIVATE lib2)
add_executable(main main.cpp)
target_link_libraries(main PRIVATE lib1)
主.cpp
#include <iostream>
#include <function2.hpp>
using namespace std;
int main() {
cout << function2() << endl;
return 0; }
源代码1.cpp
int function1() {
return 1; }
源代码2.cpp
int function2() {
return 2; }
函数1.hpp
int function1();
函数2.hpp
int function2();
1条答案
按热度按时间kmynzznz1#
您使两个库具有相同的公共包含目录(也就是说,两个库共享一个include目录来存放它们的头文件).如果你不希望链接到
lib1
的东西能够包含lib2
的头文件,那么不要将lib1
和lib2
的头文件放在同一个include目录下--使它们的头文件不能从另一个的include目录中访问。您的库是静态的,因为您没有指定它们应该是静态的还是共享的,并且您没有将
BUILD_SHARED_LIBS
设置为真实值。当指定针对静态库的链接时,CMake构建lib1
静态库和lib1
静态库。然后生成可执行文件,告诉链接器把这两个静态库都链接到可执行文件。如果你用的是C++,你想要的东西是 *而不是静态库的接口 * 的一部分,因此您只能在未命名名称空间内的非头文件中声明和定义它。