在qt 4.8中,我使用了boost(1.52)。一切都很好……现在我尝试移动到QT5,并在131 BOOST_MPL_AUX_NA_SPEC(3, if_)
行获得if.hpp: Macro argument mismatch
错误。在一些QT论坛中,有这样一个解决方案:
#ifndef Q_MOC_RUN
// All boost includes
#endif // Q_MOC_RUN
在我的每个使用boost的文件中。。。所以这里的问题是——如何告诉boost QT还没有为BOOST_MPL_AUX_NA_SPEC
做好准备,并且boost应该使用一些更原始的预处理器语法——一个与QT5兼容的语法?
更新:找到了这个解决方案,但它似乎在Qt5=(
这是我在网上搜索了几个小时后找到的最好的解决方法。这基本上是其他人一直在说的,但有一些澄清。
- 这个问题与moc.exe没有正确处理Boost宏有关
- 为了解决这个问题,我们通过为moc.exe进程定义Boost标头的包含保护来禁用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>
如果打开头文件,我可以在顶部看到include保护名为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构建
我一直在努力解决同样的问题,并发现当我删除来自moc自定义构建命令的_MSC_VER=1700
,警告对我来说消失了。
通过重写qmake.conf变量QMAKE_COMPILER_DEFINES
,我可以将其从所有自定义构建moc步骤中删除。我正在使用.pro文件生成.vcxproj文件,并使用Visual Studio 2012编译我的项目(以下是如何从.pro文件中生成.vcproj/.vcxproi文件)。
在与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)。
希望这对你也有用。
我刚刚遇到了同样的问题,并在Qt论坛上找到了有用的信息。
以下是Qt错误报告和Qt论坛线程,其中包含问题的完整描述和解决方法:
https://bugreports.qt-project.org/browse/QTBUG-29331
http://qt-project.org/forums/viewthread/22993/