Quelles bibliothèques avez-vous besoin de lier contre pour un programme clang utilisant des blocs
-
21-09-2019 - |
Question
Je l'ai découvert (ci-dessous) que je dois -fblocks utiliser lorsque la compilation du code qui utilise des blocs.
Quelle bibliothèque dois-je créer un lien contre pour laisser la détermination de linker _NSConcreteStackBlock? (Sur Ubuntu 9.10 AMD64.)
chris@chris-desktop:~$ 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.
chris@chris-desktop:~$ 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)
La solution
Clang ne fournit pas encore un moyen facile d'utiliser des blocs sur les plates-formes qui n'ont pas intégré à l'appui du système d'exploitation (par exemple, snowleopard). Vous pouvez trouver plus d'informations sur le projet libdispatch ici: http://libdispatch.macosforge.org/ et sur le projet compilateur-rt (qui fournit le moteur d'exécution de blocs) ici: http://compiler-rt.llvm.org/ mais ce n'est pas encore bien emballé pour les utilisateurs finaux Clang.
Si vous voulez creuser un peu, le projet compilateur-rt a le temps d'exécution des blocs, et vous pouvez l'utiliser pour construire une bibliothèque qui fournira le NSConcreteStackBlock.
Autres conseils
Utilisez les instructions http://mackyle.github.com/blocksruntime/ pour construire une bibliothèque libBlocksRuntime.a que vous pouvez créer un lien avec.
Installer le libBlocksRuntime sur Ubuntu avec:
sudo apt-get install llvm
sudo apt-get install clang
sudo apt-get install libblocksruntime-dev
Pour compiler, inclure la bibliothèque et -fblocks:
clang ctest.c -fblocks -lBlocksRuntime
Il est également disponible sur d'autres systèmes d'exploitation. FreeBSD et MidnightBSD comprennent tous deux des Clang et libBlocksRuntime.so