2017-02-18 23 views
1

Я строю инфраструктуру iOS с использованием Swift и Objective-C (необходимо использовать оба из них из-за других ограничений). В моем объектно-c-коде мне нужно использовать символ, назовите его MyUndefinedSymbol, который будет доступен во время выполнения, но не во время компиляции и ссылки.Маркировка символа как неопределенного в рамках iOS

Я определил, как символ extern, чтобы заглушить ошибки компилятора: extern void MyUndefinedSymbol();

Однако, компоновщик жалуется, что MyUndefinedSymbol не определен.

Вопрос: как заставить компоновщик игнорировать этот неопределенный символ?

В поисках этого много решений, никто из них не работал. То, что я пробовал:

  1. Используя флаг в -undefined компоновщика. Он устарел и не позволит включить бит-код (который мне нужен).
  2. Использование флага клана -U.
  3. Добавление атрибута weak_import с использованием __attribute__((weak_import))
  4. Использование --unresolved-symbols=ignore-all.
+0

Где символ появляется во время выполнения? –

+0

Структура (которая по существу является плагином) будет внедрена другими приложениями, которые определяют этот символ. IOW, символ будет доступен во время компиляции этих приложений, но не во время компиляции фрейма ... – MatanRubin

+2

Вы можете загрузить его во время выполнения с помощью 'dlsym()' ... –

ответ

0

Для будущих читателей: Кажется, что правильный способ сделать это именно так, как @Martin R предложил - используя dlsym() для загрузки символа во время выполнения. Обратите внимание, что dlsym не будет работать с символами, отмеченными как «Внутренние». Вы можете узнать, является ли символ внутренним, запустив nm -m в вашей библиотеке/двоичном формате.

Кроме того, решения 1 и 2 из самих вопросов должны работать, если вы отключите биткод.