Xcode project-/target-settings-синтаксис для флага синтаксиса force_load на iPhone
Я столкнулся с двойным связыванием, которое, с одной стороны, для одной из сторонних статических библиотек, используемое моим iPhone-приложением, флаг компоновщика -all_load должен быть установлен в настройках проекта или целевого приложения, иначе приложение сбой во время выполнения, не обнаруживая некоторые символы, называемые внутренне из lib, с другой стороны, для другого стороннего статического lib -all_load не следует устанавливать на уровне приложения или приложение не будет создавать благодаря "дублирующимся символам" - ошибка компоновщика.
Чтобы решить эту проблему, теперь я хочу использовать force_load-момент load_all, так как из-за документации он делает то же самое, что и all_load, но только для переданного пути или lib файла, а не для всех lib.
Проблема с force_load заключается в том, что у меня нет подсказки, как передать путь или файл в качестве параметра с ним при передаче через xcode project- или target-settings. Все возможности синтаксиса, которые приходят мне в голову, приводят к тому, что xcode думает о своем другом флаг компоновщика вместо параметра к предыдущему, или компоновщик бросает связанные с синтаксисом ошибки или флаг просто ничего не делает по сравнению с тем, что он не задан.
Я также открыл файл .pbxproj в текстовом редакторе, чтобы отредактировать его в правильной синтаксисе командной строки вручную, но при перезагрузке проекта с помощью xcode он автоматически изменяет синтаксис на интерпретацию параметра force_load как отдельный флаг.
У кого есть идея по этому вопросу?
спасибо,
Kaiserludi.
Ответы
Ответ 1
Я просто попробовал это. Я собрал статическую мускулатуру armv6, armv7 и i386 для PCRE для использования в моем проекте iPhone. Мой проект, как правило, просто добавляет мою библиотеку в проект, и эта связь отлично. Поэтому я снял флажок для целевого поля для libpcre.a и перестроен. Как и ожидалось, я получаю кучу недостающих символов-линкеров ошибок для символов pcre. Затем я открыл окно настроек цели и отредактировал раздел "Другие флаги компоновщика". Я добавил:
-force_load lib/pcre/libpcre.a
Каталог lib
находится в том же каталоге, что и файл project.xcodeproj.
Он отлично связан, поэтому я знаю, что команда force_load работала (и я вижу, что она добавлена к флагам сборки, когда xcode создает файл).
Надеюсь, что это поможет.
Update:
Я также попытался добавить системную библиотеку в строку "Другие флаги компоновщика" следующим образом:
-force_load src/pcre/libpcre.a -force_load ${SDKROOT}/usr/lib/libz.dylib
Это тоже сработало.
Ответ 2
Я просто добавил force_load в наш проект, и все отлично с использованием простейшего синтаксиса. Библиотека - это зависимость, построенная в том же проекте. Поэтому библиотека включена в командную строку связи дважды: один раз в качестве обычного входного файла и один раз в качестве аргумента для -force_load. Возможно, вы захотите поставить символы котировки вокруг аргумента.
Фактически, я даже получил эту работу, используя настройки, зависящие от конфигурации (потому что путь, очевидно, различен для отладки vs. release и устройства или симулятора).
Удачи.