2011-01-10 13 views
6

Wie kompiliere ich den folgenden Code auf Linux? Mit Ubuntu 10.10 (Maverick Meerkat).Werden Objective-C-Blöcke von Compilern unter Linux unterstützt?

 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    void (^block)() = ^{ 
    printf("Hello world"); 
    }; 
    block(); 
} 

Ich habe versucht:

 
gcc -x objective-c t.c 

Und bekam:

 
t.c: In function 'main': 
t.c:5: error: expected identifier or '(' before '^' token 

Alle Hinweise, wie diese Arbeit machen sehr geschätzt wird. Bearbeitete Frage basierend auf Feedback, danke.

+1

Haben Sie es versucht? Das könnte deine Frage beantworten .... – Jasarien

+1

Es gibt nicht das "Werkzeug", um Objective-C-Code unter Linux zu kompilieren, also hat er es vielleicht versucht und ist gescheitert und sucht jetzt nach einem anderen Werkzeug. – Alfonso

+0

Sorry Leute, ich habe versucht zu kompilieren. Ich habe die Frage aktualisiert, um weitere Details zu erhalten. Ich habe eine Google-Suche durchgeführt und gelesen, dass Blöcke nicht in der Haupt-GCC akzeptiert werden. Ich konnte nicht genug Informationen finden, um den einfachen Code zum Kompilieren zu bekommen. – user565452

Antwort

9

Der offizielle GCC enthält keine Blockunterstützung. Dafür müssen Sie entweder die Patches von Apple verwenden oder clang verwenden, einen LLVM-basierten Compiler, der gute Objective-C-Unterstützung bietet (weil Apple seine Entwicklung finanziert hat). Unter Linux ist es wahrscheinlich besser, wenn Sie nicht versuchen, die Patches von Apple auf GCC anzuwenden. Geh einfach mit Klängen.

Es reicht jedoch nicht, einen Compiler zu haben, der Blöcke unterstützt - die Laufzeit muss auch Blöcke unterstützen. Es gibt zwei Laufzeiten, die Sie mit GNUStep unter Linux verwenden können, und es gibt auch eine für BSD (libdispatch wurde nach FreeBSD portiert und benötigte eine blockfähige Laufzeit).

Der schnellste Weg, Objective-C-Unterstützung mit Blöcken unter Linux zu bekommen, ist wahrscheinlich, den neuesten Clang und den neuesten Snapshot von GNUStep-base plus das ObjectiveC2-Framework von GNUStep zu installieren. Es ist nicht wahrscheinlich, dass Ihre Distribution irgendwelche GNUStep-bezogenen Pakete hat, die neu genug sind, um mit den neuesten Laufzeiten und Compilern zu funktionieren.

+0

Danke für die Antwort! – user565452

+1

Hier ist eine Schritt-für-Schritt-Anleitung, wie man alles unter Linux aufbauen kann, einschließlich Blocks und ARC. http://feloneouscat.wordpress.com/2013/10/25/objective-c-on-ubuntu-12-04-with-blocks-and-arc/ –

0

Ja ist die kurze Antwort, aber es kann etwas Arbeit erfordern.

Die längere Antwort ist, dass Apple Open-Source-Compiler (GCC und LLVM) verwendet, so dass es keinen Grund gibt, warum sie nicht auf Linux portiert werden konnten. Ob jemand diese Arbeit tatsächlich gemacht hat, weiß ich nicht. Um etwas pedantisch zu sein, werden Blöcke auf der C-Ebene implementiert. Dies bedeutet, dass das Abrufen von Blöcken relativ einfach ist, aber viele der Bibliotheken, die sie verwenden, fehlen. Wie Robin sagt, die UI ist die wichtigste, aber Sie können GCD Port sein.

0

(Ich hasse die Tatsache, dass ich noch nicht kommentieren, da mein Ruf nicht hoch genug ist, so dass der Grund für diese „Antwort“ ist)

@ user57368 korrekt im ersten Absatz ist jedoch Es gibt (basierend auf der ursprünglichen Frage) ein paar "Probleme" mit den letzten zwei Absätzen:

GCD (Apples "großes" Threading-Tool namens Grand Central Dispatcher) ist das Laufzeit-Threading, das libdispatch nutzt, das die " dispatch_ * "Funktionen. GCD macht einen großen Nutzen (und macht den Code "netter"), indem er das Block-Konstrukt verwendet. JEDOCH GCD tut nicht müssen Blöcke, da es Funktionsversionen der Funktionsaufrufe dispatch_ * gibt.

Blocks ist eine Sprache, die auf lamdba basiert, und ist nicht abhängig von GCD/libdispatch-Funktionalität. Sie wurden beide von Apple zur gleichen Zeit in der MacOSX/iOS/Xcode-Welt eingeführt, sind aber nicht voneinander abhängig.

PS: Es gibt eine libdispatch-Implementierung für FreeBSD, die ich kürzlich gesehen habe, und einige Versuche, eine Option auch unter Linux zu implementieren.