【发布时间】: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