gpt4 book ai didi

c++ - 有没有一种标准的方法来确保一段代码在全局范围内执行?

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:04 24 4
gpt4 key购买 nike

我有一些代码想在全局范围内执行。所以,我可以像这样在编译单元中使用全局变量:

int execute_global_code();
namespace {
int dummy = execute_global_code();
}

问题是,如果这个编译单元最终出现在静态库中(或共享的-fvisibility=hidden),链接器可能会决定消除dummy ,因为它没有被使用,我的全局代码执行也是如此。

所以,我知道我可以根据特定的上下文使用具体的解决方案:特定的编译器(pragma include)、编译单元位置(属性可见性默认值)、周围代码(比如,使用dummy 在我的代码中)。

问题是,是否有一种标准方法可以确保 execute_global_code 的执行可以适合单个宏,无论编译单元放置(可执行文件还是 lib),该宏都可以工作?即:只有标准的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com