Xcode получает force_load для работы с относительными путями

Некоторым библиотекам требуется флаг компоновщика -all_load при компоновке с проектом Xcode. Однако это приводит к ошибке компоновщика, если между библиотеками возникают конфликты символов. Решение состоит в использовании -force_load, который эффективно позволяет вам использовать -all_load в одних библиотеках, но не в других.

Однако это, в свою очередь, приводит к новой проблеме, по крайней мере, для меня. Когда я использую -force_load с относительным путем к библиотеке, компоновщик всегда обнаруживает конфликты символов между библиотекой и самим собой. Похоже, что компоновщик считает, что библиотека с ее абсолютным путем и библиотека с относительным путем - это разные библиотеки, и поэтому обнаруживает конфликты между библиотекой и самим собой.

Я могу избежать этого, используя абсолютный путь с флагом. Но это не лучшее решение, так как исходный код библиотек удобно хранить в моем каталоге документов. Но путь к каталогу документов на других машинах будет другим.

Вопрос: Может ли кто-нибудь заставить force_load работать с относительным путем к библиотеке?

РЕДАКТИРОВАТЬ: для получения справочной информации см. это вопрос


person William Jockusch    schedule 24.01.2011    source источник
comment
Мне нужен $(SRCROOT), иначе я получу дублирующиеся символы   -  person onmyway133    schedule 23.08.2018


Ответы (2)


В Xcode 4, если вы включаете проект библиотеки в свой проект приложения, вы можете добавить это к другим флагам компоновщика:

-force_load $(BUILT_PRODUCTS_DIR)/<library_name.a>

Вам по-прежнему нужна зависимость, и вам также необходимо добавить библиотеку в список фреймворков и библиотек на этапе компоновки.

РЕДАКТИРОВАТЬ: Apple теперь говорит, что в некоторых выпусках Xcode 4 вы можете просто использовать этот флаг компоновщика: «-ObjC», чтобы правильно загружать библиотеки с категориями. Этот флаг отлично работает у меня в Xcode 5. Люди все еще голосуют за этот ответ, но я подозреваю, что флаг -ObjC сейчас является лучшим решением.

person David H    schedule 23.02.2011
comment
@AlexanderVasenin, это довольно серьезное заявление, вы должны подкрепить его ссылками на сообщения здесь, поддерживающие его. Лично я до сих пор об этом не слышал. - person David H; 17.12.2014
comment
Примеры: ссылка 1, ссылка 2 - person Alexander Vasenin; 17.12.2014
comment
@AlexanderVasenin первая ссылка недосказана (слухи), вторая - актуальная проблема. Но проблема (ИМХО) вовсе не проблема. Кто-то хочет связать библиотеку, в которой есть зависимость от другой библиотеки. Пользователь не хочет зависимую библиотеку, поэтому хочет избежать ошибки связи и продолжить работу, как если бы ее не было. Я бы рассматривал это как плохое решение, поскольку как разработчик может знать наверняка, что другая библиотека никогда не получит сообщения (и, следовательно, приведет к сбою пользовательского приложения)? В конце концов, это решение разработчика, а не ошибка или недостаток в флаге Apple -Objc. - person David H; 17.12.2014
comment
Дэвид, ваш ответ правильный, и я фактически поддержал его, но я нашел его, когда искал, как избавиться от флага -ObjC, который нарушил какой-то плохо написанный код, который я не собираюсь переписывать. - person Alexander Vasenin; 17.12.2014
comment
@AlexanderVasenin и я благодарю вас за это! Я просто хочу убедиться, что будущие читатели этого поста знают всю историю! С наилучшими пожеланиями! - person David H; 18.12.2014
comment
@DavidH Согласитесь с вашим утверждением, что это не недостаток Apple -Objc Flag. Существуют такие методы, как отражение, для поддержки необязательной зависимости от других библиотек. Чтобы прояснить для будущих читателей, link1 не слух. Мы обнаружили, что несколько библиотек (в том числе библиотека в ссылка 2), в которой возникала проблема при использовании флага -ObjC. Следовательно, мы хотели предоставить альтернативное предложение использования force_load для тех, кто сталкивается с ошибками компоновщика при использовании флага -ObjC. - person Bharath Booshan; 21.02.2015
comment
@BharathBooshan, спасибо за разъяснения - другие читатели обязательно это оценят! - person David H; 22.02.2015

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

-force_load $(SRCROOT)/pathToLibraryFromProject/libname.a

Что касается пути, это просто папки в вашем проекте, которые ведут туда, куда вы помещаете свою библиотеку, например, BaseFoler / Subfolder / libName.a.

person Theris10    schedule 09.05.2013
comment
Это сработало для меня. Ввод только относительного URL-адреса у меня не сработал. поэтому мне пришлось ввести абсолютный URL-адрес, чтобы он работал. Это на Xcode 8.3, Swift 3 - person Karthik Kannan; 05.05.2017