c++ - Cmake:链接到静态内部库而不导出它

标签 c++ linker cmake

我有一个具有这种结构的项目:

/path/to/my/project
├── CMakeLists.txt
├── internal-libs
│   ├── internal-lib1
├── libs
│   ├── lib1
│   ├── lib2

lib1 是一个静态库。

lib2 是一个静态库。

internal-lib1 是一个静态库。

lib2 静态链接到 lib2 和 internal-lib1。 lib1lib2 将被导出,但 internal-lib1 将被留下。对于链接,我有:

target_link_libraries(lib2 PRIVATE internal-lib1)
target_link_libraries(lib2 PRIVATE lib1)

我的理解是,因为我是静态和私密地链接,所有关于 internal-lib1 的信息都将包含在 lib2 中,我不必将 internal-lib1 导出到外部世界。

但是,当我尝试在客户端程序中使用它时,出现错误:

/usr/bin/ld cannot find -llib-internal1
collect2: error: ld returned 1 exit status

在我生成的导出配置文件中,我有:

# Create imported target lib2
add_library(lib2 STATIC IMPORTED)
set_target_properties(lib2 PROPERTIES
INTERFACE_LINK_LIBRARIES "$<LINK_ONLY:lib1>;**$<LINK_ONLY:internal-lib1>**"
)
# Create imported target lib1
add_library(lib1 STATIC IMPORTED)

是我误解了静态链接还是我的设置有问题?我正在使用 cmake 3.2.2。我的所有目标包括都是私有(private)的。我不明白为什么 INTERFACE_LINK_LIBRARIES 中填充了条目以及 LINK_ONLY 的含义。

附注实际上 lib1 和 lib2 应该是共享库,但我什至无法让静态版本工作,所以为了简单起见,我在这里描述可导出库的静态情况。

最佳答案

对于静态库 lib1lib2,CMake 命令

target_link_libraries(lib2 PRIVATE lib1)

并不意味着库 lib1 在链接时被复制到库 lib2PRIVATE 关键字只影响 transitive usage requirementslib1 当另一个库链接到 lib2 时。

要让 CMake 在链接时将 lib1 合并到 lib2 中,请使用 libtoolPOST_BUILD 操作:

add_custom_command(TARGET lib2 POST_BUILD
    COMMAND /usr/bin/libtool -static -o $<TARGET_FILE:lib2>
    $<TARGET_FILE:lib2> $<TARGET_FILE:lib1>

在这种情况下,无需使用 target_link_librarieslib1 链接到 lib2

关于c++ - Cmake:链接到静态内部库而不导出它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181626/

相关文章:

c++ - 有没有一种在转换后使用 views::filter 的有效方法? (范围适配器)

c++ - 声明 stringstream ss 之间的区别;和 std::stringstream ss;在 C++ 中?

python - 从 C++ 运行 python 脚本时内存泄漏

c++ - 在共享库的构造函数(_init 部分)中,如何知道哪个函数被中断了?

gcc - GNU gcc/ld - 使用在同一目标文件中定义的调用者和被调用者包装对符号的调用

build - 在 CMake 中处理自定义文件类型依赖项的理想方法是什么?

c++ - HelloWorld : downloading, 使用 CMake 构建和链接 Boost

c++ - QT C++ 读取每行同时包含 int 和 QString 的文件

c++ - 并发编译,串行链接

c++ - 带有 cmake 的独立静态库 (.a)