据我所知,函数级链接构建(显式或不显式)所有可能调用的图形,并且只包含可生成函数的代码到生成的二进制文件中。但它如何处理在文件级别声明的变量?
说我有
MyClass GlobalVariable;
static MyClass StaticGlobalVariable;
在某个文件中只包含这两个变量,以及一组实际上没有从剩余代码中调用的函数。
这些变量分配/初始化的代码是否会包含在输出中?
答案 0 :(得分:1)
根据经验(而不是引用标准):
如果初始化具有可见的副作用,如调用外部库或文件I / O,则始终会进行初始化。
boost::singleton_default提供了一个有趣的解决方案,只有在其他地方引用对象时才强制执行初始化,即当链接器删除对象的所有其他引用时,也会删除初始化。
答案 1 :(得分:0)
编辑:是的。 g ++ optimize flags尝试找出函数调用并修剪掉.o文件,导致链接器错误。我不确定这是否仅在某些优化标志下发生,但它确实发生了。
我们公司的一个坏习惯是在不同的文件中存在大量'extern g_GlobalFunction()'定义。由于他们的调用依赖于条件代码,因此.o文件经常被丢弃,导致链接错误。
我们使用从main()开始层次调用的g_InitModule()和g_InitFileName()调用来修复它。大多数情况下,这些都是空函数,只是为了阻止g ++丢弃.o文件。