【问题标题】:LNK 2005 linker issues with msvcrt.lib(MSVCR90.dll)LNK 2005 链接器问题与 msvcrt.lib(MSVCR90.dll)
【发布时间】:2012-09-04 23:04:38
【问题描述】:

我正在与客户共享一个静态库。 它使用的是 vs2008 sp 1。

我正在使用我用 mfc 构建的第三方库,带有共享 dll 和 /MD 选项发布版本

然后我构建了我自己的静态库,其中包括带有共享 dll 选项和 /MD 发布版本的 MFC 的第三方库。

我创建了一个测试 dll 来确保它正常工作。没有问题运行良好。 我根本没有使用 MFC。只有客户端是他们告诉我使用带有共享 dll 和 /MD 的 MFC 的原因。

现在他们抱怨他们得到了

xyz 已在 msvcrt.lib(MSVCR90.dll) 错误中定义。我认为这些看起来像 LNK2005 错误。

他们声明如下:

“由于“我的库”正在与较大的制造工具链构建中常见的许多库进行静态链接,因此具体链接失败。“我的库”正在导出这些常见的库函数,从而导致链接冲突。

他们还说:

“为了解决这个问题,“我的库”只能公开与单个 API(来自我的静态库)本身关联的函数,以保证不会导致链接冲突。导出的函数可以在“我的库”是使用链接器选项和模块定义(.def 文件)语句的组合构建的”

我不确定是什么导致了这个问题。这对我来说不是问题,但在那里。 我在想他们可能在使用不正确的选项或错误的 CRT 版本时遇到问题?

另外,我不确定我是否能满足他们可能不与 msvcrt.lib(MSVCR90.dll) 链接的要求,因为我的静态库确实依赖于标准 c 函数等。

我现在很迷茫,我确实研究了几个链接 How to distribute C run-time (CRT) Libraries

http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/

但是如果链接中说明了 CRT 的问题,那么我不确定如何弄清楚我在 vs2008 中使用的静态库是什么 CRT。我已经使用 /verbose 来查看它,但它不起作用。而且我知道dumpbin 或dependency walker 不会将它用于静态库。

为此苦苦挣扎了几天,并且疯狂地研究。没有关于为什么他们可能会遇到 msvcrt.lib(MSVCR90.dll) 问题的答案。

【问题讨论】:

  • 他的设置和你的不匹配,他正在用 /MT 而不是 /MD 编译他的程序
  • 你怎么知道的?有什么想法吗?
  • 精神力量。错误消息也有点帮助。
  • 从我读到的 /mt 使用 LIBCMT.lib 而 /md 使用 MSVCRT.lib。但是,由于我猜他们提供的消息不完整,因为我没有看到对 LIBCMT.lib 的任何引用,因此我无法建立连接。只是解释我的思考过程。可能是搞砸了。但我猜你是说如果他们对 msvcrt.lib(MSVCR90.dll) 有问题,那么这意味着他们正在使用 /MT?

标签: c++ visual-studio-2008 visual-c++ linker-errors lnk2005


【解决方案1】:

从错误消息中获取冲突库的名称。将这些库的名称添加到静态库的项目设置中(我相信在链接器设置中)。应该有一行“忽略库”,这是您应该添加库名称的地方。确保您的项目编译并且您的测试通过。然后把你新编译的静态库发给他们,看看他们是否还有冲突。如果有,请获取冲突库的名称并重复该过程。

此处描述了此修复和类似修复:http://support.microsoft.com/kb/148652

您可以尝试将 MFC 支持添加到您的项目中,以尝试在您的开发环境中本地公开冲突;我敢打赌,这会导致您遇到与他们相同的错误。当 C 运行时和 MFC 库链接乱序时会发生这种情况。

【讨论】:

  • 实际上我认为这只是一个项目设置,正如 Hans Passant 所说。您(或他们)需要使用 C++/代码生成/运行时库设置,如下所述:msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
  • 那你怎么知道它到底是什么?因为你提到的这篇文章似乎是一个合理的问题......现在我很困惑你能告诉我你的理由吗,所以我知道未来吗?谢谢
  • 像您的客户端一样使用 MFC 创建您的测试 dll,以便您可以在本地重现他们的错误。然后使用上述设置,直到不再出现链接器错误。
  • 这种问题(在 Visual Studio 中)通常通过按特定顺序包含静态库或在我包含的静态库中忽略它们等来解决。当它处理唯一的库或符号时,应该遵循我的回答中描述的技术。但是,当它类似于 c-runtime 库(如本例中)时,上面写满了“项目设置”,因为这是一个使用如此广泛的库。换句话说,这个问题比我最初想象的更基本。正确的项目设置应该可以解决它。您可能必须重新编译所有这些文件才能找到问题。
  • 感谢您的详细回复。无论如何,我都会制作一个 mfc dll,我想检查一下。但是我没有任何经验,但我无法想象这会很难。另一方面,目前的客户问题是至少根据他们所说的与项目设置相关。
猜你喜欢
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多