Как добавить определенные флаги в moc в проекте qmake?
Я компилирую исполняемый файл Qt, используя qmake && make
на следующем project.pro
файл:
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
задыхается от макроса повышения, который он не может разобрать. Чтобы обойти эту ошибку, мне нужно пройти флаг -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
Мок, но я не могу сделать это.
Как мне отредактировать мой .pro
файл для передачи данного флага moc
? (но не до g++
, как QMAKE_CXXFLAGS
делает)
7 ответов
Немного хакерски, но что если вы перезапишите компилятор 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 и не нужно ничего перекомпилировать.
Лучший способ, который я нашел для этого, основан на комментарии к принятому решению от Дэвида Фора:
QMAKE_MOC_OPTIONS += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
Другие предложенные методы, которые включают load(moc)
и манипулируя QMAKE_MOC
Сама переменная имеет неприятный побочный эффект: они не позволяют qmake автоматически добавлять INCLUDEPATH
переменные (и, возможно, другие), которые обычно находятся в командной строке moc, если INCLUDEPATH
устанавливается после звонка load(moc)
,
Этот подход упрощается, если ваша конфигурация qmake разделена на несколько файлов; вам не нужно гарантировать, что изменение командной строки moc произойдет после всех INCLUDEPATH
каталоги установлены.
Существует обновление к этой проблеме для повышения 1.53, см. Последнее сообщение здесь:
Нам нужно добавить -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
также.
Для добавления определенных флагов в moc в проекте qmake (qt5.2) необходимо:
load(moc)
QMAKE_MOC += -DBOOST_INCLUDE_GUARD_GOES_HERE
Если вы используете Ogre3D (OGRE 1.8.1 SDK для Visual C++ .Net 2010 (32-разрядная версия)), тогда используйте 32-разрядную версию QT5 вместо 64-разрядной версии QT5, она пройдет.
Также учтите это:
#ifndef BOOST_SYSTEM_NO_DEPRECATED
#define BOOST_SYSTEM_NO_DEPRECATED 1
#endif
Я думаю, что он был скомпилирован (включая boost) с 32-битным, поэтому я полагаю, что мне нужно взять src и перекомпилировать (используя мой 64-битный), но это еще одна история, где я не буду идти сейчас, начиная с OGRE 1.9 RC 1 SDK для Visual C++ .Net 2012 (64-bit) скоро выйдет на стабильной версии.
С уважением
РЕДАКТИРОВАТЬ 1:
Скачал библиотеки Qt 4.8.4 для Windows и настроил моего создателя QT (тот, который идет с полным 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 для переменных, детали которых
десять разных переменных в
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
файл.