主程序间接使用静态库。因此没有缺少引用,静态库没有链接。
GCC发布了同样的问题here。建议的解决方案也适用于我。但现在我需要用MSVC构建程序。所以我想我需要相当于GCC的--whole-archive
参数?
目前链接器调用是这样的:link.exe /nologo /out:program.exe staticLib.lib main.obj
有人可以帮我吗?
答案 0 :(得分:0)
我最近在尝试将googletest与包含测试的库链接时遇到了同样的问题,并在primer中找到了以下注释:
定义测试时,Google Test会创建某些静态对象 注册他们。这些对象不是从别处引用的 他们的构造者仍然应该运行。当Visual C ++链接器时 看到库中没有任何东西从其他地方引用它 抛出图书馆。您必须通过测试引用您的库 来自您的主程序,以防止链接器丢弃它。这是 怎么做。库中的某处代码声明了一个函数:
__declspec(dllexport) int PullInMyLibrary() { return 0; }
如果您将测试放在静态库(而不是DLL)中,那么
__declspec(dllexport)
就是 不需要。现在,在您的主程序中,编写一个调用的代码 那个功能:int PullInMyLibrary(); static int dummy = PullInMyLibrary();
这会 保持你的测试参考,并让他们自己注册 启动。
此外,如果您在静态库中定义测试,请添加
/OPT:NOREF
到主程序链接器选项。
虽然这可能不是最美丽的解决方法,但这对我来说当然有用,我认为如果有更好的解决方案,他们会在他们的入门书中提到它。