2

我正在尝试链接一个依赖于几个静态库的 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 吗?

4

1 回答 1

3

我遇到了同样的问题,我在 libs 上使用了带有 /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
于 2014-03-17T22:39:48.410 回答