尝试将boost :: filesystem链接到调试MSVC11项目时链接器错误

时间:2013-10-16 23:11:12

标签: c++ visual-c++ boost linker

我正在尝试在我的项目中使用boost::filesystem,但我遇到了链接器错误:

Error   14  error LNK1169: one or more multiply defined symbols found   C:\Users\Developer\Desktop\mandala3d\Debug\mandala.exe  1   1   mandala
Error   5   error LNK2005: "public: __thiscall std::bad_cast::bad_cast(char const *)" (??0bad_cast@std@@QAE@PBD@Z) already defined in MSVCRTD.lib(MSVCR110D.dll)    C:\Users\Developer\Desktop\mandala3d\mandala\LIBCMT.lib(stdexcpt.obj)   mandala
Error   4   error LNK2005: "public: __thiscall std::bad_cast::bad_cast(class std::bad_cast const &)" (??0bad_cast@std@@QAE@ABV01@@Z) already defined in MSVCRTD.lib(MSVCR110D.dll)  C:\Users\Developer\Desktop\mandala3d\mandala\LIBCMT.lib(stdexcpt.obj)   mandala
Error   12  error LNK2005: "public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z) already defined in LIBCMT.lib(stdexcpt.obj) C:\Users\Developer\Desktop\mandala3d\mandala\MSVCRTD.lib(MSVCR110D.dll) mandala
Error   6   error LNK2005: "public: __thiscall std::exception::exception(class std::exception const &)" (??0exception@std@@QAE@ABV01@@Z) already defined in MSVCRTD.lib(MSVCR110D.dll)  C:\Users\Developer\Desktop\mandala3d\mandala\LIBCMT.lib(stdexcpt.obj)   mandala
Error   7   error LNK2005: "public: __thiscall std::exception::exception(void)" (??0exception@std@@QAE@XZ) already defined in MSVCRTD.lib(MSVCR110D.dll)    C:\Users\Developer\Desktop\mandala3d\mandala\LIBCMT.lib(stdexcpt.obj)   mandala
Error   8   error LNK2005: "public: virtual __thiscall std::bad_cast::~bad_cast(void)" (??1bad_cast@std@@UAE@XZ) already defined in MSVCRTD.lib(MSVCR110D.dll)  C:\Users\Developer\Desktop\mandala3d\mandala\LIBCMT.lib(stdexcpt.obj)   mandala
Error   9   error LNK2005: "public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ) already defined in MSVCRTD.lib(MSVCR110D.dll)   C:\Users\Developer\Desktop\mandala3d\mandala\LIBCMT.lib(stdexcpt.obj)   mandala
Error   13  error LNK2005: "public: virtual char const * __thiscall std::exception::what(void)const " (?what@exception@std@@UBEPBDXZ) already defined in LIBCMT.lib(stdexcpt.obj)   C:\Users\Developer\Desktop\mandala3d\mandala\MSVCRTD.lib(MSVCR110D.dll) mandala
Error   10  error LNK2005: __invalid_parameter already defined in MSVCRTD.lib(MSVCR110D.dll)    C:\Users\Developer\Desktop\mandala3d\mandala\LIBCMT.lib(invarg.obj) mandala
Error   11  error LNK2005: __invoke_watson already defined in MSVCRTD.lib(MSVCR110D.dll)    C:\Users\Developer\Desktop\mandala3d\mandala\LIBCMT.lib(invarg.obj) mandala

我使用以下命令构建boost:

bootstrap
.\b2

我指的是{include}目录的$BOOSTDIR\stage\lib,我的编译器是Visual Studio 2012 (v110)

我尝试直接链接debug目录中生成的$BOOSTDIR\lib\*库,但遇到了其他错误。我还怀疑这不是静态链接库的标准或预期方式。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:6)

您正在混合使用C运行时库链接和调试/发布二进制文件。

libcmt是静态C运行时库的发行版本,而msvcrtd是动态C运行时库的调试版本。你们两个都出现了错误,这意味着你们正试图混合它们,这是你们无法做到的。

您需要重建Boost以使用与项目相同版本的C运行时,或者重建项目以使用与Boost相同的版本。但是,您当前调试和发布库混合的事实通常表明您的设置确实存在其他问题。

如果您查看项目的属性并转到C / C ++ - >代码生成,您将看到“运行时库”字段。您可以更改此项以指定项目应如何链接到C运行时。 / MDd将链接msvcrtd.dll,而/ MT将链接libcmt.lib