2015-01-16 8 views
5

Utrzymuję mieszany program wiersza poleceń C i C++, który musi działać na systemach Linux, Windows i OS X. Niedawno zaktualizowałem system do wersji Yosemite i systemu OS X kompilacja już nie działa. Błąd:Jak radzić sobie z niezgodnym z gcc kodem w nagłówkach OS X Yosemite Core

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

Other folks have run into this bug.

Linia kodu, który zawodzi, to typedef, który używa '^', który jest non-standard extension providing support for closures.

Podstawowym problemem wydaje się, że niektóre standardowe nagłówki Apple zaczynają wymagać specyficznych rozszerzeń Clang. Niestety nasz program ma bardzo głęboki zestaw zależności, z których niektóre nie będą się kompilować w Clang. Używamy kompilatorów GCC zainstalowanych za pośrednictwem MacPorts. Na razie mam obejście: zmiana linii nagłówka object.h na kompatybilną z GCC. Jednak hakowanie plików włączeniowych pod numerem /usr/include brzmi dla mnie jak żądanie kłopotów.

Czy każdy guru OS X/Clang może zaproponować bardziej zrównoważone sposoby radzenia sobie z tym problemem? Czy to ogranicza przyszłą użyteczność GCC na OS X?

+2

Clang to jedyny kompilator wspierany przez Apple dla OS X. GCC jest przestarzałe i nieobsługiwane. Nie spodziewałbym się, że nadal będzie funkcjonował. –

+0

Obawiam się, że @VariableLengthCoder jest prawdopodobnie w większości poprawny. –

+0

To daje mi sadz. No cóż, na razie jesteśmy w stanie zbudować pod Snow Leopard. –

Odpowiedz

13

Tylko dla przyszłych użytkowników, co następuje powinien dostać większość nagłówków pracy z najnowszej wersji GCC:

W dispatch/object.h zmiana

typedef void (^dispatch_block_t)(void);

do

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

aw Availability.h zmian

#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED)

do

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

Powiązane problemy