QT5 迁移和提升:if.hpp: 宏参数不匹配错误
Posted
技术标签:
【中文标题】QT5 迁移和提升:if.hpp: 宏参数不匹配错误【英文标题】:QT5 migration and Boost: if.hpp: Macro argument mismatch bug 【发布时间】:2013-02-24 21:24:56 【问题描述】:在 qt 4.8 中,我使用了 boost (1.52) 一切正常...现在我尝试移至 QT5 并在 131 BOOST_MPL_AUX_NA_SPEC(3, if_)
线上遇到 if.hpp: Macro argument mismatch
错误。在一些QT forums 中提出了这样的解决方案:
#ifndef Q_MOC_RUN
// All boost includes
#endif // Q_MOC_RUN
在我使用 boost 的每个文件中......所以这里的问题是 - 如何告诉 boost QT 还没有为BOOST_MPL_AUX_NA_SPEC
做好准备,并且 boost 应该使用一些更原始的预处理器语法来兼容 QT5?
更新:找到this solution,但在Qt5=(
【问题讨论】:
【参考方案1】:这是我在网上搜索了几个小时后找到的最佳解决方法。这基本上是其他人一直在说的,但有一些澄清。
问题与 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 并重新构建您的项目。 我正在使用 Boost 1.53 和 Qt 5.0.1 并在 Windows 7 32 位的 QtCreator 中为 MSVC2010 构建。【讨论】:
你不能只添加-DBOOST_MPL_IF_HPP_INCLUDED
只排除有问题的文件吗?
对于我来说,这是这里介绍的两个解决方案中的最佳解决方案。为 OP 干杯。【参考方案2】:
我一直在努力解决同样的问题,发现当我删除了
_MSC_VER=1700
来自 moc 的自定义构建命令,警告对我来说消失了。
通过覆盖 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(编译自 git@gitorious.org:qt/qt5.git)。
希望这对你也有用。
【讨论】:
【参考方案3】:我刚刚遇到了同样的问题,在 Qt 论坛上找到了有用的信息。
这里是 Qt 错误报告和 Qt 论坛线程,其中包含有用的问题描述和解决方法:
https://bugreports.qt-project.org/browse/QTBUG-29331
http://qt-project.org/forums/viewthread/22993/
【讨论】:
特别添加#ifndef Q_MOC_RUN
指令对我有用。以上是关于QT5 迁移和提升:if.hpp: 宏参数不匹配错误的主要内容,如果未能解决你的问题,请参考以下文章