2013-03-16 18 views
17

Viene visualizzato l'errore Parse error at "BOOST_JOIN" durante il tentativo di compilare un codice con Qt4 e CGAL. Non sto utilizzando Boost direttamente e ho già cercato e provato un sacco di opzioni come -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED e -DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION. Le versioni con cui sto lavorando sono CGAL 4.1.0, Qt 4.8.4_6 e Boost 1.53.0_1, e usando CMake per generare il Makefile, in una macchina Mac OS 10.8.2. Qualche idea su cosa potrebbe causare quell'errore?Qt4 + CGAL - Errore di analisi in "BOOST_JOIN"

risposta

6

Ho eseguito il downgrade a Boost 1.52 e ora è in fase di compilazione.

15

Quando si compila un pezzo di codice che definisce gli oggetti Qt, il sistema di generazione deve chiamare lo Qt Meta Object Compiler, ovvero "moc". Nelle versioni Qt precedenti alla 5.0, il compilatore "moc" (in realtà un precompilatore) non analizza correttamente tutto il codice C++. In particolare, non espande completamente le macro del preprocessore. Nelle recenti versioni di Boost, alcune macro (come quella di BOOST_JOIN) sono talvolta utilizzate per definire un nome di spazio dei nomi. Per esempio:

namespace BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl) { 

in boost/type_traits/detail/has_binary_operator.hpp di Boost versione 1.53.

A Qt bug è stato inserito in Qt-Project.org ed è said to be fixed in Qt-5.0.

In CGAL -4.2, ho cercato di sopprimere quegli errori di compilazione separando più l'uso di Qt e Boost in diverse unità di compilazione. Dovresti riprovare con una versione recente di Boost e CGAL-4.2-beta1 (o versioni successive se vengono rilasciate quando leggi quella risposta). Fammi sapere se incontri problemi simili con CGAL-4.2-beta1 o successivi.

Per quanto riguarda Qt-5.0, spero che CGAL-4.3 lo supporti. Dovremo lavorare sugli script di CMake per supportarlo. Sarà aggiunto alla pianificazione della prossima riunione degli sviluppatori CGAL.

+1

"Nelle versioni Qt precedenti alla 5.0, il compilatore" moc "(in realtà un precompilatore) analizza correttamente tutto il codice C++" - vuoi dire che _non_ correttamente analizza tutto il codice, penso. – davmac

+0

@davmac Grazie. +1 al tuo commento. Ho modificato la risposta di conseguenza. È strano che quell'errore di battitura sia passato inosservato fino ad allora. – lrineau

17

Questo problema si verifica in Boost 1.56.0 con QT 4.7.4 (che è abbastanza vecchio ormai),

Indipendentemente da ciò, un'altra soluzione rapida è quella di modificare i file problematici spinta di intestazione, e

add to the top: 
#ifndef Q_MOC_RUN 

add to the bottom: 
#endif 

Ciò consentirà almeno a MOC di funzionare senza morire.

+0

In aggiunta: l'istruzione '#ifndef Q_MOC_RUN .. # endif' deve incapsulare tutti gli include relativi al boost nel codice. Non dovrebbe incapsulare Qt o STL-include. – Tones29