我有一些想要在全局范围内执行的代码。因此,我可以在编译单元中使用全局变量,如下所示:
int execute_global_code();
namespace {
int dummy = execute_global_code();
}
问题是,如果这个编译单元最终出现在静态库中(或者与 -fvisibility=hidden
共享的库),链接器可能会决定消除 dummy
,因为它没有被使用,以及我的全局代码执行。
所以,我知道我可以根据特定上下文使用具体的解决方案:特定编译器(pragma include)、编译单元位置(属性可见性默认)、周围代码(例如,虚拟使用 dummy
在我的代码中)。
问题是,是否有一种标准方法可以确保执行 execute_global_code
,该方法可以适合单个宏,无论编译单元放置如何(可执行文件或库),该宏都可以工作?即:只有标准 C++,并且该宏之外没有用户代码(例如在 main()
中虚拟使用 dummy
)
最佳答案
问题是链接器将使用所有目标文件来链接直接提供给它的二进制文件,但对于静态库,它只会提取那些定义当前 undefined symbol 的目标文件。
这意味着,如果静态库中的所有目标文件仅包含此类自注册代码(或未从链接的二进制文件引用的其他代码) - 则不应使用整个静态库中的任何内容!
对于所有现代编译器来说都是如此。不存在独立于平台的解决方案。
可以找到一种使用 CMake 来规避此问题的非侵入性源代码方法 here - 阅读更多相关信息 here - 如果不使用预编译头,它将起作用。用法示例:
doctest_force_link_static_lib_in_target(exe_name lib_name)
有一些特定于编译器的方法可以做到这一点,因为 grek40 已经 pointed out在评论中。
关于c++ - 是否有一个标准方法来确保一段代码在全局范围内执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41891482/