8

在 qt 4.8 中,我使用了 boost (1.52) 一切都很好...现在我尝试移至 QT5 并if.hpp: Macro argument mismatch在线出错131 BOOST_MPL_AUX_NA_SPEC(3, if_)。在一些QT 论坛中,提出了这样的解决方案:

#ifndef Q_MOC_RUN
// All boost includes
#endif // Q_MOC_RUN

在我使用 boost 的每个文件中......所以这里的问题是 - 如何告诉 boost QT 还没有准备好,BOOST_MPL_AUX_NA_SPEC并且 boost 应该使用一些更原始的预处理器语法,这些语法与 QT5 兼容?


更新:找到了这个解决方案,但它似乎在 Qt5=(

4

3 回答 3

6

这是我在网上搜索了几个小时后能够找到的最佳解决方法。这基本上是其他人一直在说的,但有一些澄清。

  • 该问题与 moc.exe 未正确处理 Boost 宏有关。
  • 为了解决这个问题,我们通过为 moc.exe 进程定义它们的包含保护来禁用 Boost 标头的包含,但不适用于常规源代码编译。
  • 这可以通过将以下代码添加到您的项目文件(例如 myproject.pro)中最容易地完成:

    # ensure QMAKE_MOC contains the moc executable path
    load(moc) 
    
    # for each Boost header you include...
    QMAKE_MOC += -DBOOST_INCLUDE_GUARD_GOES_HERE 
    

例如,如果我想使用日志库,我将拥有:

#include <boost/log/trivial.hpp>

如果我打开头文件,我可以在顶部看到包含保护名为BOOST_LOG_TRIVIAL_HPP_INCLUDED_. 因此,.pro 文件中的相应行将显示为:

QMAKE_MOC += -DBOOST_LOG_TRIVIAL_HPP_INCLUDED_

如果它们与任何人相关,还有一些注意事项:

  • 如果您发现这不起作用,请确保在您向项目文件添加新行时运行 qmake 并重建您的项目。
  • 我正在使用 Boost 1.53 和 Qt 5.0.1,并在 Windows 7 32 位的 QtCreator 中为 MSVC2010 构建。
于 2013-05-24T01:40:43.970 回答
3

我一直在努力解决同样的问题,发现当我 _MSC_VER=1700从 moc 的自定义构建命令中删除定义时,警告对我来说消失了。

通过覆盖 qmake.conf 变量,我能够从所有自定义构建 moc 步骤中删除它QMAKE_COMPILER_DEFINES。我正在使用 .pro 文件生成 .vcxproj 文件并使用 Visual Studio 2012 编译我的项目(以下是如何从 .pro 文件生成 .vcproj/.vcxproj 文件)。

在与 win32-msvc2012 关联的 qmake.conf 文件中,该变量如下:

QMAKE_COMPILER_DEFINES += _MSC_VER=1700 _WIN32

在我的 .pro 文件中,我用这个覆盖了它:

QMAKE_COMPILER_DEFINES = _WIN32

然后我重新生成了 .vcxproj 文件,它编译时没有宏参数不匹配警告。

我正在使用 VS 2012、boost 1.51 和 qt 5.1.2(编译自 git@gitorious.org:qt/qt5.git)。

希望这对你也有效。

于 2013-09-19T23:17:57.210 回答
2

我刚刚遇到了同样的问题,并在 Qt 论坛上找到了有用的信息。

以下是 Qt bugreport 和 Qt-forum 线程,其中包含有用的问题描述和解决方法:

https://bugreports.qt-project.org/browse/QTBUG-29331

http://qt-project.org/forums/viewthread/22993/

于 2013-03-22T14:54:06.970 回答