Как добавить определенные флаги в 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 файл.

Другие вопросы по тегам