如何在 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_DEBUG
和QMAKE_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 添加特定标志?的主要内容,如果未能解决你的问题,请参考以下文章