【问题标题】:How can I find out which library is including libcmt?如何找出包含 libcmt 的库?
【发布时间】:2014-03-12 14:07:46
【问题描述】:

我正在尝试链接一个依赖于几个静态库的 Windows 可执行文件(其中一些我已经构建,其中一些我没有构建)。当我做链接时,我得到了一堆错误,比如:

LIBCMT.lib(mlock.obj) : error LNK2005: _unlock already defined in MSVCRT.lib(MSVCR100.dll)

这是经典的 /MD 与 /MT 问题(C 运行时是静态链接还是动态链接)。我首先尝试了简单的解决方案,添加链接器标志

/nodefaultlib:libcmt /nodefaultlib:libcpmt

但这只是给出了不同的错误:

msvcprt.lib(MSVCP100.dll) : error LNK2005: "public: __cdecl std::_Locinfo::~_Locinfo(void)" (??1_Locinfo@std@@QEAA@XZ) already defined in gtest.lib(gtest-all.cc.obj)
gtest.lib(gtest-all.cc.obj) : error LNK2001: unresolved external symbol "private: static int std::locale::id::_Id_cnt" (?_Id_cnt@id@locale@std@@0HA)

我已经浏览了我正在构建的库,据我所知,我正在构建它们/MD。我说“据我所知”,因为其中一些是带有自己的 makefile 的第三方库,所以我无法完全控制构建过程。

我认为“依赖”不适用于库(仅 EXE 和 DLL),是否有一种工具可以让我查看我正在链接的各种库,并在我查看时查看哪个库引入了 libcmt想改用 msvcrt 吗?

【问题讨论】:

  • 你不能用 boost 控制这个的前提是错误的。它甚至为 .lib 文件使用了不同的名称,您所能做的就是选择错误的名称。不是 gtest,典型的谷歌问题,你真的必须重建它。 /MD 是通用的“始终有效”设置,请始终使用它。
  • 抱歉,提到 boost 是个坏主意。涉及到的第三方库有好几个,boost只是其中一个。我正在选择我认为正确的 boost 库,但是 (1) 我可能做错了,并且 (2) 还有其他第三方库不那么直接。

标签: windows linker msvcrt visual-studio-2010 libcmtd


【解决方案1】:

我遇到了同样的问题,我在库中使用了带有 /DIRECTIVES 选项的 dumpbin (http://msdn.microsoft.com/en-us/library/z66yd3h6.aspx)。它将显示许多 /DEFAULTLIB 部分,每个部分都是您的库尝试使用的另一个库。 Dumpbin 需要从 Visual Studio 命令提示符运行。

dumpbin /DIRECTIVES liblua52.lib

我有 100 多个包含所有解决方案配置和平台的库,所以我制作了一个 python 2.7 脚本 (crtdisplay.py) 来为我做这件事。它可以在我的 bitbucket 存储库中找到,地址为 https://bitbucket.org/vimarina/ctrlcv/src/57b7ddca15b5c7fefddcf20ffcea0633223a4bd6/crtdisplay。把它放在你的库的根目录中。该代码中没有太多错误检查,因此如果失败,请不要感到惊讶:)。我使用了 Visual Studio 2010,因此在其他版本的 Visual Studio 上可能会失败。

 crtdisplay.py > info.txt

【讨论】:

  • 我在使用 dumpbin 时遇到了麻烦,因为 /DIRECTIVES 没有显示任何有趣的东西。事实证明,有些库根本没有。这些都不是问题!扫描所有库,直到找到一些列出指令并最终找到冲突的库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
相关资源
最近更新 更多