cmake 当我的可执行文件与一个私有链接到另一个库的库链接时,为什么PRIVATE不能像我期望的那样工作?

waxmsbnn  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(149)

我写了一个小的测试项目来理解PRIVATE关键字在cmake的target_link_libraries()函数中是如何工作的。我们有一个main目标,它链接到第一个库lib1,而这个第一个库又链接到第二个库lib2。依赖关系的传递处理在任何情况下都是PRIVATE。所以我期望main只能访问lib1的函数,同样lib1只能访问lib2的函数(见下面的图表和代码)。现在在main中,我们直接从lib2调用一个函数。然而,项目链接和执行正常,所以我没有得到它。
更详细地说,我认为target_link_libraries(lib1 PRIVATE lib2)将lib1的属性填充为LINK_LIBRARIES=lib2target_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();
kmynzznz

kmynzznz1#

您使两个库具有相同的公共包含目录(也就是说,两个库共享一个include目录来存放它们的头文件).如果你不希望链接到lib1的东西能够包含lib2的头文件,那么不要将lib1lib2的头文件放在同一个include目录下--使它们的头文件不能从另一个的include目录中访问。
您的库是静态的,因为您没有指定它们应该是静态的还是共享的,并且您没有将BUILD_SHARED_LIBS设置为真实值。当指定针对静态库的链接时,CMake构建lib1静态库和lib1静态库。然后生成可执行文件,告诉链接器把这两个静态库都链接到可执行文件。如果你用的是C++,你想要的东西是 *而不是静态库的接口 * 的一部分,因此您只能在未命名名称空间内的非头文件中声明和定义它。

相关问题