【问题标题】:How to force MSVC to link an unused static library (Equivalent of GCCs --whole-archive parameter) [duplicate]如何强制 MSVC 链接未使用的静态库(等效于 GCC --whole-archive 参数)[重复]
【发布时间】:2015-04-02 07:40:35
【问题描述】:

有一个静态库被主程序间接使用。因此没有遗漏的引用,也没有链接静态库。

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

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

有人可以帮我吗?

【问题讨论】:

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


【解决方案1】:

我最近在尝试将 googletest 与包含测试的库链接时遇到了同样的问题,并在他们的 primer 中找到了以下注释:

当您定义测试时,Google Test 会创建某些静态对象 注册他们。这些对象不是从其他地方引用的,而是 他们的构造函数仍然应该运行。当 Visual C++ 链接器 看到库中的任何内容都没有从其他地方引用它 把图书馆扔出去。您必须通过测试引用您的库 从你的主程序中,以防止链接器丢弃它。这是 怎么做。在您的库代码中的某处声明一个函数:

__declspec(dllexport) int PullInMyLibrary() { return 0; } 

如果您将测试放在静态库(而不是 DLL)中,那么 __declspec(dllexport) 是 不需要。现在,在你的主程序中,编写一个调用 那个函数:

      int PullInMyLibrary();
      static int dummy = PullInMyLibrary(); 

这将 保持您的测试被引用,并使它们在 启动。

此外,如果您在静态库中定义测试,请添加 /OPT:NOREF您的主程序链接器选项。

虽然这可能不是有史以来最漂亮的解决方法,但这肯定对我有用,我认为如果有更好的解决方法,他们会在他们的入门书中提到它。

【讨论】:

  • 这不是错误,尽管您链接到的页面上有声明。
  • @JamesMcNellis 是的,我已经在 linux 上对其进行了测试,看起来如果没有 --whole-archive 也无法正常工作。毕竟,更好的解决方案是以不同的方式组织程序。
猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 2015-08-06
  • 2011-04-21
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
相关资源
最近更新 更多