如何在 qmake 项目中向 moc 添加特定标志?

Posted

技术标签:

【中文标题】如何在 qmake 项目中向 moc 添加特定标志?【英文标题】:How to add specific flags to moc in a qmake project? 【发布时间】:2011-12-13 09:38:41 【问题描述】:

我在以下project.pro 文件上使用qmake && make 编译Qt 可执行文件:

INCLUDEPATH *= ../../dependencies/boost
QT *= opengl xml
CONFIG *= qt opengl static

TARGET = myexe
HEADERS = Viewer.hpp MainWindow.hpp Inspector.hpp
SOURCES = main.cpp Viewer.cpp MainWindow.cpp Inspector.cpp

但是,在编译时,moc 会阻塞无法解析的 boost 宏。要解决this bug,我需要将标志-DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED 传递给moc,但我无法做到。

如何编辑我的.pro 文件以将给定标志传递给moc? (但不是g++,就像QMAKE_CXXFLAGS那样)

【问题讨论】:

【参考方案1】:

有点骇人听闻,但是如果您覆盖 moc 编译器以使其包含标志呢?在 .pro 中:

QMAKE_MOC = $$QMAKE_MOC -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED

【讨论】:

有点老套,但至少这是一个开始。谢谢! 在 Qt5 上为我工作:确保在您 QMAKE_MOC += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED 之前先 load(moc) 更好的解决方案,QMAKE_MOC_OPTIONS += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED 对于 cmake,您只需添加:ADD_DEFINITIONS(-DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED)【参考方案2】:

在我的头文件代码中,我只有:

#ifndef Q_MOC_RUN
    //Here we include Boost or Ogre headers with Macro
#endif

它在 Qt5 x64 中完美运行,无需重新编译任何东西。

【讨论】:

【参考方案3】:

对于 boost 1.53 有一个更新,请看最后一个帖子here:

我们还需要添加-DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION

【讨论】:

【参考方案4】:

在 qmake 项目(qt5.2) 中添加特定标志到 moc 需要:

    load(moc)
    QMAKE_MOC += -DBOOST_INCLUDE_GUARD_GOES_HERE

【讨论】:

【参考方案5】:

我发现这样做的最佳方法是基于对 David Faure 接受的解决方案的评论:

QMAKE_MOC_OPTIONS += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED

涉及load(moc) 和操纵QMAKE_MOC 变量本身的其他建议方法有一个不幸的副作用:它们阻止qmake 自动添加通常在moc 命令行上的INCLUDEPATH 变量(可能还有其他变量),如果在调用load(moc) 之后设置了INCLUDEPATH

如果您将 qmake 配置拆分为多个文件,这种方法会更容易组合;您无需确保在设置所有 INCLUDEPATH 目录后更改 moc 命令行。

【讨论】:

【参考方案6】:

查看例如the Qmake docs for variables 的详细信息

QMAKE_CFLAGS_* 模式中有十个不同的变量,并且

QMAKE_CXXFLAGS* 模式中的十个不同变量

因此我将从QMAKE_CXXFLAGS 开始,它被记录为:

QMAKE_CXXFLAGS

此变量包含 C++ 编译器标志 在构建项目时使用。这个变量的值通常是 由 qmake 或 qmake.conf 处理,很少需要修改。这 可以通过修改来调整特定于调试和发布模式的标志 QMAKE_CXXFLAGS_DEBUGQMAKE_CXXFLAGS_RELEASE 变量, 分别。注意:在 Symbian 平台上,可以使用该变量 将体系结构特定的选项传递给 Symbian 中的每个编译器 构建系统。例如:

QMAKE_CXXFLAGS.CW += -O2
QMAKE_CXXFLAGS.ARMCC += -O0 

有关更多信息,请参阅 qmake 平台说明。

所以我要开始

QMAKE_CXXFLAGS += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED

您可以将其添加到您的 .pro 文件中。

【讨论】:

这会将标志添加到所有 C++ 编译中,不仅是 moc 调用,还有 g++ 调用,这是完全不可取的(如果我使用 @ 保护的 boost 功能,可能会破坏构建987654333@。那么,如何将标志传递给moc而不是g++ 好吧,也许你不能,在这种情况下,你可能必须创建一个 shell 脚本 moc 来调用带有添加选项的 moc.real 二进制文件,或者尝试在如果 g++ 使用 d (以保护编译),则未设置的代码但在使用 moc 时处于活动状态。或者使用我建议的-D标志,但如果使用g++,则在头文件中使用#undef 是的,我已经制定了变通策略。我想要一种干净的方式,或者有经验的用户确认这根本不可能(这看起来很奇怪)。【参考方案7】:

如果你在做 Ogre3D (OGRE 1.8.1 SDK for Visual C++ .Net 2010 (32-bit) ) 然后使用 QT5 32bit 而不是 QT5 64bit 版本,它将通过。

还要考虑这个:

#ifndef BOOST_SYSTEM_NO_DEPRECATED
#define BOOST_SYSTEM_NO_DEPRECATED 1
#endif

我认为它已经用 32 位编译(包括增强),因此我想我必须使用 src 并重新编译(使用我的 64 位),但这是另一个故事,因为 OGRE 1.9 RC 1 SDK for Visual C++ 以来我现在不会去。 Net 2012 (64-bit) 即将推出稳定版。

问候

编辑 1:

下载了适用于 Windows 的 Qt 库 4.8.4 并配置了我的 QT 创建器(带有完整 QT5 的那个,猜猜是什么……。在 4.8.4 上编译时,Ogre3D 的工作就像一个魅力。

Qt 5.0.2 for Windows 32-bit (VS 2010, 485 MB)
Qt libraries 4.8.4 for Windows (VS 2010, 234 MB)
OGRE 1.8.1 SDK for Visual C++ .Net 2010 (32-bit)

我也提到了这里有兴趣的人:http://qt-project.org/forums/viewreply/128660/

【讨论】:

以上是关于如何在 qmake 项目中向 moc 添加特定标志?的主要内容,如果未能解决你的问题,请参考以下文章

在visual studio 2010中为新的QOBJECT文件生成MOC

QMake在moc文件上的多个定义

揭开这个命令行构建序列的神秘面纱

waf : 将编译器标志传递给 qt 的 moc

如何在 Ember.js 中向 DOM 添加特定元素?

如何在 Python 中向直方图添加特定的 x 刻度线? [复制]