Com quais bibliotecas você precisa vincular para um programa de clang usando blocos
-
21-09-2019 - |
Pergunta
Descobri (abaixo) que preciso usar -fblocks ao compilar código que usa blocos.
Com que biblioteca eu preciso vincular para permitir que o vinculador resolva _NSCONCRETEstackBlock? (No 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)
Solução
O CLANG ainda não fornece uma maneira fácil de usar blocos em plataformas que não possuem suporte de sistema operacional interno (por exemplo, snowloopard). Você pode encontrar mais informações sobre o projeto Libdispatch aqui: http://libdispatch.macosforge.org/e no projeto Compiler-RT (que fornece o tempo de execução dos blocos) aqui: http://compiler-rt.llvm.org/Mas isso ainda não está bem embalado para usuários finais do CLANG.
Se você quiser cavar um pouco, o projeto Compiler-RT possui o tempo de execução dos blocos e você pode usá-lo para criar uma biblioteca que fornecerá o NSconcreteStackBlock.
Outras dicas
Use as instruções em http://mackyle.github.com/blocksruntime/ Para construir uma biblioteca LibBlocksRuntime. Uma com a qual você pode vincular.
Instale o libblocksruntime no Ubuntu com:
sudo apt-get install llvm
sudo apt-get install clang
sudo apt-get install libblocksruntime-dev
Para compilar, inclua a biblioteca e -fblocks:
clang ctest.c -fblocks -lBlocksRuntime
Isso também está disponível em outros sistemas operacionais. FreeBSD e Midnightbsd incluem Clang e Libblocksruntime.so