提问人:Croquette the Soothsayer 提问时间:9/24/2023 最后编辑:Croquette the Soothsayer 更新时间:9/25/2023 访问量:66
确保链接器包含静态库中的特定文件
Ensure linker include specific files from static library
问:
我的目标和那个家伙差不多:静态初始化和销毁静态库的全局变量
带有链接器标志的链接库的解决方案效果很好(至少正在发生静态实例化,但我不确定副作用)。我对此并不满意,因为您基本上强制将每个 .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 配置的任何内容即可添加或删除文件)
所有资源都找到了关于强制整个存档的地方,几乎没有关于粒度控制的内容,但也许我在这里滥用了链接器。 这里的主要例子之一。
感谢您抽出宝贵时间接受采访!
答:
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_always
my_lib
评论
0赞
Croquette the Soothsayer
9/25/2023
这确实有效,但它意味着您将代码拆分为两个库(这再次改变了可执行文件请求链接库的方式)。就我而言,库是消费者代码,因此将其分成两部分并没有什么意义。无论如何,它仍然比包含整个存档要好,谢谢!
1赞
Croquette the Soothsayer
9/25/2023
我将首先对对象库进行一些研究,以确保它适合作为解决方案,主要是检查副作用!
评论