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