我在以下qmake && make
文件中使用project.pro
编译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
所做的那样)
有点hackish,但如果你覆盖moc编译器,以便它包含标志,那该怎么办呢。在.pro中:
QMAKE_MOC = $$QMAKE_MOC -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
在头文件的代码我只有:
#ifndef Q_MOC_RUN
//Here we include Boost or Ogre headers with Macro
#endif
它在Qt5 x64中完美运行,无需重新编译任何内容。
这个问题有针对boost 1.53的更新,请参阅上一篇文章here:
我们还需要添加-DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
。
要在qmake项目(qt5.2)中向moc添加特定标志,需要:
load(moc)
QMAKE_MOC += -DBOOST_INCLUDE_GUARD_GOES_HERE
例如,参见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 Platform Notes。
所以我开始吧
QMAKE_CXXFLAGS += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
你可以添加到你的.pro
文件。
如果您正在使用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位)将很快在稳定版本上发布。
问候
编辑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/
我发现这样做的最好方法是基于David Faure接受的解决方案的评论:
QMAKE_MOC_OPTIONS += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
其他提出的涉及load(moc)
和操纵QMAKE_MOC
变量本身的方法有一个不幸的副作用:它们阻止qmake自动添加通常在moc命令行上的INCLUDEPATH
变量(也许是其他变量),如果在调用后设置INCLUDEPATH
load(moc)
。
如果将qmake配置拆分为多个文件,则此方法更容易组合;您不需要确保在设置所有INCLUDEPATH
目录之后更改moc命令行。