【问题标题】:linker error when using Qt and Boost使用 Qt 和 Boost 时的链接器错误
【发布时间】:2012-01-02 01:36:30
【问题描述】:

当我在我的 c++ 项目中同时使用 Qt (v4.7.4) 和 Boost(尝试过 v1.47 和 v1.48)时,我收到一个由包含 <boost\filesystem.hpp> 的类引起的链接器错误。我刚刚设置了 Qt,并且在代码正常工作之前没有任何问题。

这是错误信息:

...obj:错误 LNK2001:未解析的外部符号“私有:静态类 std::codecvt const * & __cdecl boost::filesystem3::path::wchar_t_codecvt_facet(void)”(?wchar_t_codecvt_facet@path@filesystem3@boost @@CAAAAPBV?$codecvt@GDH@std@@XZ)

...obj : 错误 LNK2001: 无法解析的外部符号 "void __cdecl boost::filesystem3::path_traits::convert(char const *,char const *,class std::basic_string,class std::allocator > &,类 std::codecvt const &)" (?convert@path_traits@filesystem3@boost@@YAXPBD0AAV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@ABV? $codecvt@GDH@5@@Z)

...obj : 错误 LNK2001: 无法解析的外部符号 "void __cdecl boost::filesystem3::path_traits::dispatch(class boost::filesystem3::directory_entry const &,class std::basic_string,class std::allocator > &,class std::codecvt const &)" (?dispatch@path_traits@filesystem3@boost@@YAXABVdirectory_entry@23@AAV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2 @@std@@ABV?$codecvt@GDH@6@@Z)

...obj:错误 LNK2001:未解析的外部符号“void __cdecl boost::filesystem3::path_traits::convert(unsigned short const *,unsigned short const *,class std::basic_string,class std::allocator > &,class std::codecvt const &)" (?convert@path_traits@filesystem3@boost@@YAXPBG0AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ ABV?$codecvt@GDH@5@@Z)

...exe : 致命错误 LNK1120: 4 unresolved externals

编辑:

Here我发现有人有这个问题得出这个结论:

这确实是一个 Qt 问题。使用 wchar_t 作为本机类型,您必须 使用相同的编译器开关重新编译 Qt。甚至还有一个bug 追踪者:https://bugreports.qt.io/browse/QTBUG-9617

一般来说,你必须非常小心,不要混用 wchar_t 项目中的编译器设置,因为它们将变得不兼容。

所以我重新编译了Qt设置/Zc:wchar_t,但没有显示任何效果。我仍然得到同样的错误。

【问题讨论】:

  • 你编译过boost吗?我不太熟悉究竟需要构建什么,但有些库确实如此。
  • 是的。如果我没记错的话,我已经使用 b2.exe 为 Visual Studio 2010 编译了它。
  • 是否有必要重新编译整个 boost 库?我不记得确切的构建配置,但我在编译 boost 时绝对没有更改 treat wchar_t as build-in type 属性。
  • 你能从你的编译器输出中至少包含一行吗?也许cl ...?在我看来,您的/Zc:wchar_t 出于某种原因没有使用。您的编译器输出会显示这一点。
  • 对不起,我的意思是当你编译导致问题的程序时。 “编译输出”窗口显示用于编译程序的命令。你应该有类似cl -c -nologo -Zm200 -Zc:wchar_t -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -WX ... blah ... blah ... blah

标签: c++ visual-studio-2010 qt boost linker-errors


【解决方案1】:

我认为你在正确的轨道上,但听起来你的 -Zc:wchar_t 没有“坚持”。我们必须做同样的事情才能让 Qt 对 Google Breakpad 和 ICU 库感到满意。我们更改了(QT_SOURCE)\mkspecs\win32-msvc2008\qmake.conf 中的/Zc:wchar_t 设置并从源代码编译了Qt,之后一切正常。

当您构建使用 Qt 和 Boost 的项目时,您应该在编译器输出中看到此选项。比如:

cl -c -nologo -Zm200 -Zc:wchar_t ... (etc.)

如果您已经在没有此选项的情况下构建了 Qt,您可能必须先执行make confclean 以确保所有内容确实 使用新设置重新构建。

听起来像-Zc:wchar_t will be the default in Qt 5。

【讨论】:

    【解决方案2】:

    使用 boost-1.49,Qt 4.4 和 VS2005 有同样的问题。转到项目属性,然后将“配置属性 -> C/C++ -> 语言 -> 将 wchar_t 视为内置类型”设置为“是”即可解决问题。

    【讨论】:

      【解决方案3】:

      Qt 可能改变了您的程序在运行时配置方面的拓扑结构:因此,您使用的 boost 库(文件系统)在许多通过命名约定访问的配置中都有 - 找不到。

      例如,多线程运行时需要 mt 在库名称中的某个位置(我希望我记得很清楚,但无论如何,请参阅详细记录完整的文档)。这种命名对程序员来说是相当透明的,因为 pragma 可以促进程序员适当地使用来简化不同编译器下的库使用。

      您应该错过非 wchar 文件系统.lib。当我使用 Windows 时,我使用 boost Jam 来与 Visual C++ 交互(可能要追溯到过去的 millenium!)。我希望它仍然可以使用。

      【讨论】:

      • 我不确定我是否理解。我将boost_filesystem-vc100-mt-1_47.lib添加到我的依赖项并将$(BOOST)\stage\lib添加到目录。路径绝对没问题,我已经从另一个项目中复制了它们,该项目正在编译没有错误。我检查了所有工作表的runtime library 属性,它们都设置为multithreaded DLL (/MD),就像在我的其他项目中一样。由于这些设置是相同的,我认为这不是命名问题,还是我错了?
      • 对不起,我不恰当地提到了多线程,因此 mt,您清楚地解释了这是字符类型的变化。我希望我能在适当的技术细节上验证我的臀部代谢。
      猜你喜欢
      • 2016-08-10
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多