Поддерживаются ли блоки Objective-C компиляторами в Linux? - PullRequest
6 голосов
/ 10 января 2011

Как мне скомпилировать следующий код в linux?Используя Ubuntu 10.10 (Maverick Meerkat).

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

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

Я попробовал:

gcc -x objective-c t.c 

И получил:

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

Любое руководство о том, как сделать эту работуоценили.Отредактированный вопрос, основанный на обратной связи, спасибо.

Ответы [ 3 ]

9 голосов
/ 10 января 2011

Официальный GCC не включает поддержку блоков.Для этого вам нужно либо использовать патчи Apple, либо использовать clang, основанный на LLVM компилятор, который имеет хорошую поддержку Objective-C (потому что Apple финансирует его разработку).В Linux вам, вероятно, лучше не пытаться применять патчи Apple к GCC.Просто используйте clang.

Однако просто иметь компилятор, который поддерживает блоки, недостаточно - среда выполнения также должна поддерживать блоки.Есть две среды выполнения, которые вы можете использовать с GNUStep в linux, и есть одна для BSD (libdispatch был портирован на FreeBSD, и для него требовалась среда с поддержкой блоков).

Самый быстрый способ получить поддержку target-c с блоками в linux - это установить последний clang и последний снимок GNUStep-base, а также инфраструктуру ObjectiveC2 из GNUStep.Маловероятно, что в вашем дистрибутиве есть какие-либо пакеты, связанные с GNUStep, достаточно новые, чтобы хорошо работать с новейшими средами исполнения и компиляторами.

0 голосов
/ 24 октября 2016

(я ненавижу тот факт, что пока не могу комментировать, так как моя репутация недостаточно высока, вот почему этот «ответ»)

@ user57368 правильно в первом абзаце, однако есть (на основе исходного вопроса) несколько «проблем» с последними двумя абзацами:

GCD («отличный» инструмент многопоточности от Apple, называемый Grand Central Dispatcher) - это многопоточная среда исполнения, в которой используется libdispatch, обеспечивающий функции «dispatch_ *» GCD отлично использует (и делает код «лучше») с помощью конструкции блоков. ОДНАКО GCD не нужны блоки, так как существуют версии функций вызовов функции dispatch_ *.

Blocks - это конструкция, основанная на языке lamdba, которая не зависит и не обеспечивает функциональность GCD / libdispatch. Они оба были представлены Apple одновременно в мире MacOSX / iOS / Xcode, но они не зависят друг от друга.

PS: недавно я видел реализацию libdispatch для FreeBSD, а также некоторые попытки реализовать опцию в Linux.

0 голосов
/ 10 января 2011

Да, это короткий ответ, но это может потребовать некоторой работы.

Более длинный ответ заключается в том, что Apple использует компиляторы с открытым исходным кодом (GCC и LLVM), поэтому нет никаких причин, по которым они не могут быть перенесены на Linux. Кто-нибудь на самом деле сделал эту работу, я не знаю. Чтобы быть немного педантичным, блоки реализованы на уровне C, так. Это означает, что получение блоков будет относительно простым, но вы упустите многие библиотеки, которые их используют. Как говорит Робин, пользовательский интерфейс является основным, но вы сможете портировать GCD .

...