Windows C++下链接库的静态初始化
Static initialization in linked library under Windows C++
我有一个配置,它有一个库和一个控制台应用程序。他们现在都是光秃秃的。我使用的是Visual Studio 2010,库和控制台应用程序都静态链接到运行时。控制台应用程序还链接到库。
在库中,我可以将此代码添加到源文件中:
class MyClass
{
public:
MyClass()
{
printf("MyClass loadedn");
}
};
class MyClass2
{
public:
static MyClass my_class;
};
MyClass MyClass2::my_class;
现在,我的理解是my_class应该在main()之前的某个时刻初始化。然而,它从未发生过(因为我没有收到打印的信息)。
然而,我可以使用两种不同的方法对其进行初始化:
- 将代码放在控制台应用程序中。这样做肯定会调用printf()语句
- 修改MyClass2以包含从库中的全局变量调用的静态函数,并在控制台应用程序的main()中使用该全局变量
上面#2的例子:
库文件:
class MyClass
{
public:
MyClass()
{
printf("MyClass loadedn");
}
};
class MyClass2
{
public:
static MyClass my_class;
static int Ping();
};
MyClass MyClass2::my_class;
int my_global = MyClass2::Ping();
控制台应用程序文件:
extern int my_global;
int main()
{
printif("%d", my_global);
}
Windows是否试图通过延迟加载链接库的静态变量来帮助我??或者有我设置的编译器设置吗?这种行为完全出乎我的意料。
是最终可执行文件的"库文件"部分。如果是静态链接库中的对象文件,它将只是一部分如果最终可执行文件解析了未解析的外部符号。(这是库的定义。)如果永远不要在对象文件中使用任何符号,它不会是你的可执行文件,就好像源文件不是应用程序。
如果库是动态加载的,情况会稍微不同的.dll
作为一个单元(而不是对象文件)由对象文件,所以它实际上不是一个库),但如果没有将通过加载DLL来解析的未解析符号,它也不会被加载。
您可能想要做的是针对对象文件进行链接,并且而不是针对库。在Visual Studio中,这意味着将所有资源放在同一个项目中。或你可以将库链接为.dll
,然后使用显式加载LoadLibrary
。(这就是我们为图书馆所做的被引用,因为它们具有静态对象的构造函数它们自己注册。)
相关文章:
- 使用g++静态初始化带有命名标签的嵌套C++结构
- 静态初始化的反义词是什么?
- 在静态初始化期间运行代码
- 结构数组的嵌入式C++静态初始化
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 使用 constexpr 和 std::array 进行静态初始化来替换动态初始化的 std::vector 的闰年
- MSVC 2017 在单个翻译单元中违反静态初始化顺序
- VC++6 线程安全静态初始化
- 具有必要副作用的静态初始化被优化掉了
- 未使用全球的静态初始化器
- w/ w/结构带char缓冲液的静态初始化[]
- 静态初始化的对象不能放在块中尝试
- 功能指针的静态初始化
- lambda(或函数)C++中的静态初始化
- C++静态初始化顺序:添加到映射中
- 复杂类型数组的静态初始化
- C++ - 在派生类中静态初始化受基类保护的成员变量
- 静态初始化插件工厂
- 静态初始化包含功能指针的对象的constexpr std ::数组
- 找出静态初始化是否结束