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