2013-02-24 18 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)。

希望這也適用於你。