当我使用我的一个类实现
在现有的cpp中添加此代码时#include <iostream>
struct TestStruct{
TestStruct(int i)
{
std::cerr << i << std::endl;
x = i;
}
int x;
};
TestStruct t(8);
在执行main
之前打印8。
但是当我创建新的空文件test.cpp并在其中放入相同的代码时,没有打印任何内容。我检查了这个cpp是否被编译和链接。所有cpp文件编译为静态lib,然后将此lib与main.o链接在可执行文件中。我只使用g ++ 5.3选项-std=C++14
。
为什么在第二种情况下错过了全局变量初始化?
答案 0 :(得分:8)
您将TestStruct
类作为单独的模块添加到静态库中,并将其与可执行文件链接。
使用静态库的唯一目的是只有具有任何符号,类或其他资源的模块才能被链接到可执行文件中。静态库中没有任何由主可执行文件直接或间接引用的符号的模块不会链接到主可执行文件中。这就是静态库的全部内容。
因为您的可执行文件没有对TestStruct
类的显式引用,所以该模块没有链接到您的可执行文件,并且没有成为最终可执行文件的一部分。
但是当您在可执行文件已经引用和使用的现有模块中添加TestStruct
类(直接或间接)时,此类与其他模块中的所有其他符号和类一起被链接进入你的可执行文件并成为最终可执行文件的一部分。
因为您的可执行文件引用了该模块中的某些符号或其他资源,所以该模块中的所有内容(包括测试类)都会链接到可执行文件中。