【问题标题】:Visual Studio C++ - Link LIBCMT.lib and LIBCMTD.lib (Debug Version)Visual Studio C++ - 链接 LIBCMT.lib 和 LIBCMTD.lib(调试版)
【发布时间】:2013-08-07 08:01:25
【问题描述】:

我想在 Visual Studio 2008 中编译和链接我的项目作为调试项目 (MTd)。该项目包括几个外部 dll,其中一个 dll 与可用的非调试版本一样(MD 和 MT 版本)。现在,如果我尝试链接我的项目,它要么说重新声明 LIBCMT.lib 和 LIBCMTD.lib 中的东西,要么如果我尝试不允许非调试版本 (/NODEFAULTLIB:LIBCMT) 它缺少符号。

现在我可以使用所有外部库的 MT 版本,但由于同样的错误,我仍然无法将其编译并链接为 MTd 版本来调试我的项目。

另一种方法(在我看来)是允许重新定义,我认为这是可能的 @gnu 编译器/链接器,但我在 Visual Studio 的 c++ 中找不到任何关于此的内容。

关于如何处理这个问题的任何想法? (记住:不能将外部 dll 编译为 debug-dll)

作为一个额外的一般性问题:是否甚至可以创建一个使用非调试 dll 的调试项目?

【问题讨论】:

  • 您正试图在您的程序中有意使用 多个 版本的 CRT。你会得到一个用于你的 EXE 和另一个用于你的 DLL,可能更多。这是非常非常不明智的,您将在它们之间传递对象和指针时遇到重大问题。始终使用 /MD,因此程序中只有一个 CRT。
  • 是的,这是不明智和必要的......因为我需要一个可调试的项目并且只有一些外部 DLL 的发布版本。对于发布版本,无论如何它都是一致的。
  • 您需要与从事这些 DLL 工作的程序员交谈。当然,他们可以为您提供调试版本。您不太可能在这里找到它们。
  • 您的意思是,“我不想要获得调试版本”。这肯定比花十分钟在网站上花费更多的精力。也可能要花钱,这永远无法与免费的 Q+A 网站竞争。使用 /MD 而不是 /MDd 构建并交叉手指说您没有 CRT 或分配器问题。如果 CRT 版本仍然不匹配,请降级您的 VS 版本。祝你好运。
  • 你有什么问题?仍然不可能获得调试版本。如果有的话,无论如何都是免费的。没有人回答我的问题 - 那么究竟什么是免费的?我使用 /MD 和 /MDd 构建 - /MD 不会产生任何问题(当然) - 但我仍然需要调试版本。如果您想具有建设性,请尝试回答问题 - 并停止抱怨为此目的制作的网站上提出的问题。

标签: visual-studio-2008 linker visual-studio-debugging


【解决方案1】:

看起来“正确”的解决方案是使用相同的参数 (MTd) 重建所有外部库。正如我所说,这是不可能的。我通过不忽略任何默认库解决了这个问题。相反,我找到了我正在寻找的参数。在链接器选项中 - 我添加了附加行:/FORCE - 它忽略了符号的重新定义。这不是一个完美的解决方案,它可能不适用于任何项目 - 但总比没有好......

此外,我必须将 Incremental Link 设置为 NO,否则 embed.manifest 将无法正确构建(尽管我已阅读这也可能是抗病毒问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多