【问题标题】:Linker errors when attempting to link boost::filesystem to debug MSVC11 project尝试链接 boost::filesystem 以调试 MSVC11 项目时出现链接器错误
【发布时间】:2013-10-25 06:48:02
【问题描述】:

我试图在我的项目中使用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

我指向库包含目录的$BOOSTDIR\stage\lib,我的编译器是Visual Studio 2012 (v110)

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

我在这里做错了什么?

【问题讨论】:

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


    【解决方案1】:

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

    libcmt 是静态 C 运行时库的发布版本,而msvcrtd 是动态 C 运行时库的调试版本。你们都出现在错误中,这意味着您试图将它们混合在一起,这是您无法做到的。

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

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

    【讨论】:

    • 我将运行时库更改为 Multi-threaded debug (\MTd),现在我只收到一个链接器错误:错误 3 错误 LNK1104:无法打开文件 'libboost_filesystem-vc110-mt-sgd-1_54.lib'。我检查了我的 stage\lib 目录,发现我有 libboost_filesystem-vc110-mt-gd-1_54.lib,而不是 libboost_filesystem-vc110-mt-sgd-1_54.lib。这两者有什么区别?
    • 另外,更改运行时库有什么影响?我觉得我真的不应该这样做。
    • 静态链接运行时库将强制您的应用程序使用您构建的版本,而不是在系统上找到的版本。动态链接通常更好。我不知道 sgd 中的 s 是什么意思,但是名字描述了这个库是如何构建的;您可以在 Boost 文档之一中找到符号列表及其含义。
    • 我检查了命名法,发现s 代表static,这意味着我不是在构建静态库,而是试图静态链接它们。现在重建。
    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多