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

Xcode - заставить force_load работать с относительными путями

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

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

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

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

EDIT: для получения дополнительной информации см. этот вопрос

4b9b3361

Ответ 1

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

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

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

EDIT: Apple теперь говорит о выпуске Xcode 4, в котором вы можете просто использовать этот флаг компоновщика: "-ObjC", чтобы получить библиотеки с категорией для правильной загрузки. Этот флаг работает отлично для меня в Xcode 5. Люди все еще голосуют за этот ответ, но я подозреваю, что флаг -ObjC теперь является лучшим решением.

Ответ 2

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

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

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