QT5迁移和Boost:if.hpp:宏参数不匹配错误

时间:2013-02-24 21:24:56

标签: c++ qt boost qt5 c-preprocessor

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

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

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


更新:发现this solution但在Qt5中似乎没有任何影响=(

3 个答案:

答案 0 :(得分: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并重建项目。
  • 我在Qt 5.0.1中使用Boost 1.53,在Windows 7 32位上使用QtCreator中的MSVC2010构建。

答案 1 :(得分:3)

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

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

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

QMAKE_COMPILER_DEFINES += _MSC_VER=1700 _WIN32

在我的.pro文件中,我用它来覆盖它:

QMAKE_COMPILER_DEFINES = _WIN32

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

我正在使用VS 2012,提升1.51和qt 5.1.2(从git@gitorious.org编译:qt / qt5.git)。

希望这也适合你。

答案 2 :(得分:2)

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

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

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

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