Как добавить определенные флаги в moc в проекте qmake?
я компилирую исполняемый файл Qt, используя qmake && make
на следующее :
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, который он не может разобрать. Чтобы обойти эта ошибка, мне нужно передать флаг -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
moc, но я не могу этого сделать.
как я редактирую мой .pro
файл для передачи данного флага в moc
? (но не g++
, as QMAKE_CXXFLAGS
нет)
7 ответов
немного 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, см. Последний пост здесь:
нам нужно добавить -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
также.
для добавления определенных флагов в moc в проекте qmake (qt5.2) нужно:
load(moc)
QMAKE_MOC += -DBOOST_INCLUDE_GUARD_GOES_HERE
см., например,документы Qmake для переменных детали
десять различных переменных в
QMAKE_CFLAGS_*
узор, идесять различных переменных в
QMAKE_CXXFLAGS*
шаблон
и, следовательно, я бы начал с QMAKE_CXXFLAGS
который задокументирован как:
QMAKE_CXXFLAGS
эта переменная содержит флаги компилятора C++, которые используется при построении проект. Значение этой переменной обычно обрабатывается qmake или qmake.conf и редко нуждается в корректировке. Этот флаги, специфичные для режимов отладки и выпуска, можно настроить путем изменения the
QMAKE_CXXFLAGS_DEBUG
иQMAKE_CXXFLAGS_RELEASE
переменные, соответственно. Примечание: на платформе Symbian эту переменную можно использовать передача архитектурных параметров каждому компилятору в Symbian система сборки. Например:QMAKE_CXXFLAGS.CW += -O2 QMAKE_CXXFLAGS.ARMCC += -O0
для получения дополнительной информации см. qmake Platform Записи.
поэтому я бы начал с
QMAKE_CXXFLAGS += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
который вы можете просто добавить в свой .
Если вы делаете Ogre3D (Ogre 1.8.1 SDK для Visual C++ .Net 2010 (32-бит)), то используйте Qt5 32bit вместо Qt5 64bit версии, он пройдет.
также рассмотрим это:
#ifndef BOOST_SYSTEM_NO_DEPRECATED
#define BOOST_SYSTEM_NO_DEPRECATED 1
#endif
Я думаю, что он был скомпилирован (boost включен) с 32bit, поэтому я полагаю, что мне нужно взять src и перекомпилировать (используя мой 64bit), но это еще одна история, куда я не пойду сейчас, так как OGRE 1.9 RC 1 SDK для Visual C++ .Net 2012 (64-бит) скоро будет выпущен на стабильной версия.
в отношении
изменить 1:
скачал Qt библиотеки 4.8.4 для Windows и настроил мой Qt creator (тот, который поставляется с полным QT5 и угадайте, что.... Ogre3D работает как шарм при компиляции на 4.8.4.
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_OPTIONS += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
другие предлагаемые методы, которые включают load(moc)
и управления QMAKE_MOC
переменная сама по себе имеет неудачный побочный эффект: они предотвращают автоматическое добавление qmake INCLUDEPATH
переменные (и, возможно, другие), которые обычно находятся в командной строке moc, если INCLUDEPATH
настройка после вызов load(moc)
.
этот подход сочиняет легче, если у вас есть конфигурация qmake разделена на несколько файлов; вам не нужно гарантировать, что изменение в командной строке moc происходит в конце концов INCLUDEPATH
каталогов.