2010-02-19 13 views
5

Ich habe (unten) entdeckt, dass ich -fblocks beim Kompilieren von Code verwenden muss, der Blöcke verwendet.Welche Bibliotheken müssen Sie für ein clang-Programm mit Blöcken verknüpfen

Welche Bibliothek muss ich verknüpfen, damit der Linker _NSConcreteStackBlock auflöst? (Bei Ubuntu 9.10 AMD64.)

[email protected]:~$ clang ctest.c 

ctest.c:3:25: error: blocks support disabled - compile with -fblocks or pick a 
     deployment target that supports them 
void call_a_block(void (^blockptr)(int)) { 
         ^
ctest.c:11:19: error: blocks support disabled - compile with -fblocks or pick a 
     deployment target that supports them 
    call_a_block(^(int y) { 
       ^
2 diagnostics generated. 
[email protected]:~$ clang ctest.c -fblocks 
/tmp/cc-4sPSeO.o: In function `main': 
ctest.c:(.text+0x79): undefined reference to `_NSConcreteStackBlock' 
collect2: ld returned 1 exit status 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Antwort

5

Clang bietet keine noch eine einfache Möglichkeit, Blöcke auf Plattformen zu verwenden, das nicht über Betriebssystem-Unterstützung eingebaut (zum Beispiel Snowleopard). Sie können einige weitere Informationen über das libdispatch Projekt finden Sie hier: http://libdispatch.macosforge.org/ und auf der Compiler-rt-Projekt (die die Blöcke Laufzeit zur Verfügung stellt) hier: http://compiler-rt.llvm.org/ aber das ist noch nicht gut für Clang Endverbraucher verpackt.

Wenn Sie ein wenig graben wollen, hat das Compiler-RT-Projekt die Blöcke Laufzeit darin, und Sie können das verwenden, um eine Bibliothek zu erstellen, die den NSConcreteStackBlock bereitstellen wird.

0

Installieren Sie das libBlocksRuntime auf Ubuntu mit:

sudo apt-get install llvm 
sudo apt-get install clang 
sudo apt-get install libblocksruntime-dev 

zu kompilieren, sind die Bibliothek und -fblocks:

clang ctest.c -fblocks -lBlocksRuntime 

Dies ist auf andere Betriebssysteme zur Verfügung. FreeBSD und MidnightBSD enthalten beide clang und libBlocksRuntime.so