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

myW*_*SON 8 c++ qt boost c-preprocessor qt5

在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
Run Code Online (Sandbox Code Playgroud)

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


更新:发现这个解决方案但似乎没有在Qt5中带来任何影响=(

geo*_*erd 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 
    
    Run Code Online (Sandbox Code Playgroud)

例如,如果我想使用日志库,我会:

#include <boost/log/trivial.hpp>
Run Code Online (Sandbox Code Playgroud)

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

QMAKE_MOC += -DBOOST_LOG_TRIVIAL_HPP_INCLUDED_
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您发现这不起作用,请确保在向项目文件添加新行时运行qmake并重建项目.
  • 我在Qt 5.0.1中使用Boost 1.53,在Windows 7 32位上使用QtCreator中的MSVC2010.


小智 2

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

以下是 Qt 错误报告和 Qt 论坛线程,其中包含问题的有用描述和解决方法:

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

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