2011-12-13 21 views
8

posso compilare un eseguibile Qt utilizzando qmake && make sul project.pro seguente file:Come aggiungere specifici flag a moc in un progetto qmake?

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 

Tuttavia, durante la compilazione, moc strozzatori su una macro spinta che essa non può analizzare. Per aggirare lo this bug, ho bisogno di passare la bandiera -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED in moc, ma non riesco a farlo.

Come modificare il file .pro per passare un determinato flag a moc? (Ma non g++, come QMAKE_CXXFLAGS fa)

risposta

10

Un po 'di hacker, ma cosa succede se si sovrascrive il compilatore moc in modo che includa il flag. Nella .pro:

QMAKE_MOC = $$QMAKE_MOC -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED 
+0

A bi t hackish, ma almeno è un inizio. Grazie! –

+2

Sembra non lavorare su QT5 .. = ((qualche consiglio? – myWallJSON

+0

sta lavorando per me su QT5: assicurarsi di 'carico (MOC)' 'prima di QMAKE_MOC + = -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED' – sjwarner

0

veda ad esempio the Qmake docs for variables che dettaglia

  • dieci diverse variabili nel modello QMAKE_CFLAGS_* e

  • dieci diverse variabili nel modello QMAKE_CXXFLAGS*

e quindi vorrei iniziare con QMAKE_CXXFLAGS che è documentato:

QMAKE_CXXFLAGS

Questa variabile contiene il compilatore C++ pari utilizzato nella costruzione di un progetto. Il valore di questa variabile è in genere gestito da qmake o qmake.conf e raramente deve essere modificato. I flag specifici per il debug e le modalità di rilascio possono essere modificati modificando le variabili QMAKE_CXXFLAGS_DEBUG e QMAKE_CXXFLAGS_RELEASE, rispettivamente. Nota: sulla piattaforma Symbian, questa variabile può essere utilizzata per passare le opzioni specifiche dell'architettura a ciascun compilatore nel sistema di generazione Symbian . Ad esempio:

QMAKE_CXXFLAGS.CW += -O2 
QMAKE_CXXFLAGS.ARMCC += -O0 

Per ulteriori informazioni, vedere Note sulla piattaforma qmake.

Così mi piacerebbe iniziare con

QMAKE_CXXFLAGS += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED

che si può semplicemente aggiungere al file .pro.

+1

Questo aggiunge i flag a tutte le compilation C++, non solo alle chiamate 'moc' ma anche a quelle' g ++ ', che è totalmente indesiderabile (e potrebbe interrompere la compilazione se ho usato le funzioni boost protette da' BOOST_TT_HAS_OPERATOR_HPP_INCLUDED'. come passare flag a 'moc' ma non a' g ++ '? –

+0

Beh, forse non si può in questo caso si potrebbe dover creare uno script di shell' moc' che chiama il binario 'moc.real' con l'aggiunta opzione, o prova un '# ifdef' nel codice che viene annullato se' g ++ 'è usato d (per proteggere la compilazione) ma attivo quando' moc' è usato. O usa il flag '-D' che ho suggerito ma' # undef' it in un file di intestazione se è usato 'g ++' –

+0

Sì, ho già una strategia di aggancio sul posto. Mi piacerebbe un modo pulito di farlo, o una conferma da un utente esperto che non è possibile a tutti (che sembrerebbe strano) –

1

C'è un aggiornamento per questo problema per spinta 1.53, vedi l'ultimo post here:

Abbiamo bisogno di aggiungere -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION anche.

0

Se si esegue Ogre3D (OGRE 1.8.1 SDK per Visual C++ .Net 2010 (32 bit)), utilizzare QT5 a 32 bit anziché la versione a 64 bit QT5.

Considera anche questo:

#ifndef BOOST_SYSTEM_NO_DEPRECATED 
#define BOOST_SYSTEM_NO_DEPRECATED 1 
#endif 

Penso che è stato compilato (boost inclusa) con 32bit quindi suppongo che devo prendere src e ricompilare (usando il mio 64 bit), ma questa è un'altra storia in cui i wont go per ora dal momento che OGRE 1.9 RC 1 SDK per Visual C++ .Net 2012 (64-bit) sarà presto rilasciato su versione stabile.

saluti

EDIT 1:

librerie Qt 4.8.4 scaricato per Windows e configurato il mio creatore QT (quello proveniente con piena QT5 e indovinate un po '... Ogre3D sta lavorando come un fascino durante la compilazione on. . 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) 

ho anche menzionate per chi è interessato qui: http://qt-project.org/forums/viewreply/128660/

3

nel mio codice nell'intestazione Ho solo i file:

#ifndef Q_MOC_RUN 
    //Here we include Boost or Ogre headers with Macro 
#endif 

Funziona perfettamente in Qt5 x64 e non è necessario ricompilare nulla.

+0

Opere per me, grazie! –

1

Per aggiungere bandiere specifiche per moc in un progetto qmake (qt5.2) necessità:

load(moc) 
    QMAKE_MOC += -DBOOST_INCLUDE_GUARD_GOES_HERE 
0

Il modo migliore che ho trovato per fare questo si basa su un commento sulla soluzione accettata da David Faure:

QMAKE_MOC_OPTIONS += -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED 

Gli altri metodi proposti che implicano load(moc) e manipolare la variabile QMAKE_MOC stessa avere un effetto collaterale: prevengono qmake di aggiungere automaticamente INCLUDEPATH variabili (e forse altri) che sarebbero normalmente si trova sulla riga di comando di moc, se è impostato dopo la chiamata a load(moc).

Questo approccio è più semplice se la configurazione di qmake è suddivisa in più file; non è necessario assicurarsi che la modifica alla riga di comando moc venga dopo che sono state impostate tutte le directory INCLUDEPATH.