Подтвердить что ты не робот

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.

4b9b3361

Ответ 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 и устройства или симулятора).

Удачи.