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

问题描述 投票:0回答:1

我的目标和那个人几乎一样: 静态库全局变量的静态初始化和销毁

使用链接器标志

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

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 static-libraries
1个回答
0
投票

您可以将最终二进制文件(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)

my_lib_always
中的所有定义都被引入,参见仅使用来自
my_lib
的定义。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.