如何找出包含libcmt的库?

时间:2014-03-12 14:07:46

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

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

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

这是经典/ MD vs. / 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吗?

1 个答案:

答案 0 :(得分:3)

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

运行
dumpbin /DIRECTIVES liblua52.lib

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

 crtdisplay.py > info.txt