2015-01-16 5 views
5

ho mantenere un C++ programma a riga di comando C misto e che ha bisogno per funzionare su Linux, Windows e OS X. Recentemente ho aggiornato a Yosemite e il mio OS X la build sta fallendo. L'errore è:Come affrontare il codice non-gcc compatibile nelle intestazioni OS X Yosemite core

/usr/include/dispatch/object.h:143:15: error: expected identifier or '(' before '^' token 

Other folks have run into this bug.

La riga di codice che non riesce è un typedef che utilizza '^' che è un non-standard extension providing support for closures.

Il problema sottostante sembra essere che alcune intestazioni standard di Apple stanno iniziando a richiedere estensioni specifiche di Clang. Sfortunatamente il nostro programma ha un insieme molto profondo di dipendenze, alcune delle quali non verranno compilate sotto Clang. Abbiamo usato i compilatori GCC installati tramite MacPorts. Per il momento ho una soluzione: modificare la linea nell'intestazione object.h in modo che sia compatibile con GCC. Tuttavia, l'hacking dei file include sotto /usr/include mi sembra un problema.

Qualche guru OS X/Clang può suggerire metodi più sostenibili per affrontare questo problema? Questo limita l'utilità futura di GCC su OS X?

+2

Clang è l'unico compilatore supportato da Apple per OS X. GCC è deprecato e non supportata. Non mi aspetterei che continui a funzionare. –

+0

temo che @VariableLengthCoder sia probabilmente per lo più corretto. –

+0

Questo mi dà il sadz. Oh beh, siamo ancora in grado di costruire sotto Snow Leopard per ora. –

risposta

13

Solo per i futuri visitatori, il seguente dovrebbe ottenere la maggior parte le intestazioni che lavorano con una recente versione di GCC:

In dispatch/object.h cambiamento

typedef void (^dispatch_block_t)(void);

a

#ifdef __clang__ 
typedef void (^dispatch_block_t)(void); 
#else 
typedef void* dispatch_block_t; 
#endif 

e in Availability.h cambiamento

#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED)

a

#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && defined(__clang__)