如何强制MSVC链接未使用的静态库(等效的GCCs --whole-archive参数)

时间:2015-04-02 07:40:35

标签: c++ visual-c++ linker

主程序间接使用静态库。因此没有缺少引用,静态库没有链接。

GCC发布了同样的问题here。建议的解决方案也适用于我。但现在我需要用MSVC构建程序。所以我想我需要相当于GCC的--whole-archive参数?

目前链接器调用是这样的:link.exe /nologo /out:program.exe staticLib.lib main.obj

有人可以帮我吗?

1 个答案:

答案 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到主程序链接器选项。

虽然这可能不是最美丽的解决方法,但这对我来说当然有用,我认为如果有更好的解决方案,他们会在他们的入门书中提到它。