如何在VC++中强制引用静态库里的所有全局变量

这个坑啊…… 真是历史悠久名声昭著了。

假如你的exe用到了一个静态库,而这个静态库有一些全局变量。那么这些全局变量未必会被引用到这个exe当中。

举个例子:
Foo.h:
===================
class Foo
{
public:
Foo();
};
===================

Foo.cpp:
===================
#include "Foo.h"
#include <stdio.h>


Foo::Foo()
{
printf("hello");
}

static Foo foo;
===================
假如Foo.cpp是被编译成静态库,那么链接的时候可能没有foo这个变量,从而也不会有"hello"输出。

有些人写代码喜欢用全局变量来实现singleton,并且期望这些singleton的构造函数会在main函数之前被调用。呵呵…… 到了vc这里就不灵了。

可是,如果万一他的代码就是这样,你又没法改,办法还是有的。

办法1:链接的时候加 /WHOLEARCHIVE 。这是VS 2015 update 2以后才有的选项

办法2:
1. 要以项目引用的方式来引用静态库,而不是把.lib文件作为input给linker
2. 把“link library dependencies” 和 "Use link library dependency inputs” 这两个选项设置成true。






此博客中的热门博文

在windows下使用llvm+clang

少写代码,多读别人写的代码

tensorflow distributed runtime初窥