确保链接器包含静态库中的特定文件

Ensure linker include specific files from static library

提问人:Croquette the Soothsayer 提问时间:9/24/2023 最后编辑:Croquette the Soothsayer 更新时间:9/25/2023 访问量:66

问:

我的目标和那个家伙差不多:静态初始化和销毁静态库的全局变量

带有链接器标志的链接库的解决方案效果很好(至少正在发生静态实例化,但我不确定副作用)。我对此并不满意,因为您基本上强制将每个 .o 都包含在最终可执行文件中,而且您必须指定要在库的实际“消费者”中以这种方式链接它:--whole-archive

target_link_libraries(my_exec
        PRIVATE -Wl,--whole-archive
        my_lib
        -Wl,--no-whole-archive // to ensure flags only apply to this dependency
)

基本上,我正在努力实现这两件事:

  • 强制包含特定文件而不是整个存档
  • 使这些规范仅在静态库 CMake 项目中已知。如果您直接在相关 .cpp 文件中编写某种装饰器,则加分(这意味着您无需更改 cmake 配置的任何内容即可添加或删除文件)

所有资源都找到了关于强制整个存档的地方,几乎没有关于粒度控制的内容,但也许我在这里滥用了链接器。 这里的主要例子之一。

感谢您抽出宝贵时间接受采访!

C++ CMake 静态库

评论


答:

1赞 TooTone 9/25/2023 #1

您可以将最终二进制文件(exe 左右)中希望始终包含的目标文件链接到对象库中。

add_library(my_lib_always OBJECT file1.cpp file2.cpp)
add_library(my_lib file3.cpp file4.cpp)

从可执行文件链接到它们。

target_link_libraries(my_exec PRIVATE my_lib_always my_lib)

中的所有定义都会被引入,c.f. 仅从 .my_lib_alwaysmy_lib

评论

0赞 Croquette the Soothsayer 9/25/2023
这确实有效,但它意味着您将代码拆分为两个库(这再次改变了可执行文件请求链接库的方式)。就我而言,库是消费者代码,因此将其分成两部分并没有什么意义。无论如何,它仍然比包含整个存档要好,谢谢!
1赞 Croquette the Soothsayer 9/25/2023
我将首先对对象库进行一些研究,以确保它适合作为解决方案,主要是检查副作用!