Какие библиотеки вам нужно связать с программой clang с использованием блоков?
-
21-09-2019 - |
Вопрос
Я обнаружил (ниже), что мне нужно использовать -fblocks при компиляции кода, использующего блоки.
Какую библиотеку мне нужно связать, чтобы компоновщик разрешил _NSConcreteStackBlock?(В 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)
Решение
Clang пока не предоставляет простой способ использования блоков на платформах, не имеющих встроенной поддержки операционной системы (например, SnowLeopard).Дополнительную информацию о проекте libdispatch можно найти здесь: http://libdispatch.macosforge.org/а проект compiler-rt (который обеспечивает среду выполнения блоков) здесь: http://compiler-rt.llvm.org/но это еще не очень хорошо подготовлено для конечных пользователей Clang.
Если вы хотите немного покопаться, в проекте compiler-rt есть среда выполнения блоков, и вы можете использовать ее для создания библиотеки, которая предоставит NSConcreteStackBlock.
Другие советы
Используйте инструкции на http://mackyle.github.com/blocksruntime/ чтобы создать библиотеку libBlocksRuntime.a, с которой вы можете связать.
Установите libBlocksRuntime в Ubuntu с помощью:
sudo apt-get install llvm
sudo apt-get install clang
sudo apt-get install libblocksruntime-dev
Для компиляции подключите библиотеку и -fblocks:
clang ctest.c -fblocks -lBlocksRuntime
Это также доступно в других операционных системах.FreeBSD и MidnightBSD включают clang и libBlocksRuntime.so.