我的目标和那个人几乎一样: 静态库全局变量的静态初始化和销毁
使用链接器标志
--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
)
基本上我正在努力实现这两件事:
所有资源都在关于强制整个存档的地方找到,几乎没有任何关于粒度控制的内容,但也许我在这里滥用了链接器。 主要示例之一此处。
感谢您的宝贵时间!
您可以将最终二进制文件(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
的定义。