2013-02-24 22 views
8

在qt 4.8我使用了boost(1.52)一切正常...现在我尝试移动到QT5并在131 BOOST_MPL_AUX_NA_SPEC(3, if_)行上得到if.hpp: Macro argument mismatch错误。在一些QT forums有提出这样一个解决方案:QT5迁移和Boost:if.hpp:宏参数不匹配错误

#ifndef Q_MOC_RUN 
// All boost includes 
#endif // Q_MOC_RUN 
在我的每一个文件,使用升压

...所以这里的问题是 - 如何告诉提振该QT是没有准备好BOOST_MPL_AUX_NA_SPEC和升压应当使用一些会与QT5兼容的更原始的预处理器语法?


更新:发现this solution但似乎没有把所有的QT5 =(

回答

6

这是最好的解决方法,我已经能够找到净几个小时后找到网。这基本上是其他人所说的,但有一些澄清。

  • 该问题与moc.exe未正确处理Boost宏有关。
  • 为了解决这个问题,我们通过定义moc.exe进程的include guard来禁止包含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 
    

例如,如果我想使用的日志库,我d有:

#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构建。
+0

难道你不能只添加'-DBOOST_MPL_IF_HPP_INCLUDED'来只排除有问题的文件吗? – 2013-08-06 08:24:21

+0

谢谢,这工作正常(MSVM2012,Qt5.1.1,升压1.55.0) – Marc 2013-11-18 12:52:20

+0

这是为我的目的这里提出的两个最好的解决方案。欢迎OP。 – sjwarner 2014-05-29 05:30:41

3

我一直在挣扎了同样的问题,并发现,当我删除的 _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,boost 1.51和qt 5.1.2(编译自[email protected]:qt/qt5.git)。

希望这也适用于你。