Как избавиться от предупреждения "файл был создан для неподдерживаемого формата файла" при связывании со статической библиотекой?
У меня есть приложение, которое включает в себя внешнюю библиотеку, которую я разработал, и я получаю следующее предупреждающее сообщение каждый раз, когда компилирую с помощью устройства в качестве цели:
mylib-release-iphonesimulator.a, файл был создан для неподдерживаемого формата файла которая не является архитектурой (armv7).
У меня есть две версии библиотеки, которые добавлены в проект. Один построен для iphonesimulator, а другой для iphoneos.
Несмотря на то, что он хорошо работает на любой цели (кажется, компилятор принимает правильную версию библиотеки в зависимости от цели), подобное предупреждение становится анонимным.
Есть ли способ избавиться от предупреждения или даже лучше скомпилировать обе платформы в одной библиотеке, избегая наличия двух двоичных файлов одной и той же библиотеки?
Спасибо!
Ответы
Ответ 1
Вы не хотите избавляться от этой ошибки, вы хотите ее исправить.
Проблема заключается в том, что вы связываете версию симулятора вашей библиотеки с конструкцией устройства вашего приложения. Симулятор хочет библиотеки в архитектуре i386, и устройство нуждается в вещах в архитектуре armv6 или armv7.
Итак, решение здесь - связать правильную версию вашей библиотеки.
То, что я обычно делаю, это объединить их в одну библиотеку и позволить компоновщику выбрать подходящую версию для меня. Вот что вы делаете в терминале:
$ cd /path/to/my/libraries
$ ls
libMyLibrary-Device.a
libMyLibrary-Simulator.a
$ file libMyLibrary-Device.a
libMyLibrary-Device.a: Mach-O universal binary with 2 architectures
libMyLibrary-Device.a (for architecture armv6): current ar archive random library
libMyLibrary-Device.a (for architecture armv7): current ar archive random library
$ file libMyLibrary-Simulator.a
libMyLibrary-Simulator.a: Mach-O universal binary with 1 architecture
libMyLibrary-Simulator.a (for architecture i386): current ar archive random library
$ lipo -create -output libMyLibrary.a libMyLibrary-Device.a libMyLibrary-Simulator.a
$ ls
libMyLibrary-Device.a
libMyLibrary-Simulator.a
libMyLibrary.a
$ file libMyLibrary.a
libMyLibrary.a: Mach-O universal binary with 3 architectures
libMyLibrary.a (for architecture armv6): current ar archive random library
libMyLibrary.a (for architecture armv7): current ar archive random library
libMyLibrary.a (for architecture i386): current ar archive random library
Затем вы просто связываете libMyLibrary
вместо версии устройства или симулятора, и компоновщик будет делать правильные вещи.
Ответ 2
У меня была такая же проблема с библиотекой SQLite 3 (libsqlite3.dylib). Я открыл старый проект и собрал ту же самую библиотеку. Я сравнил информацию о цели > Настройки сборки > Пути поиска в каждом проекте, а в то время, когда старый (рабочий) проект был пустым, в более раннем проекте было несколько путей поиска в "Пути поиска в базе данных". Удаление всех из них решило проблему. Надеюсь, это помогает кому-то, это заняло у меня много-много часов, чтобы понять.
Ответ 3
Если вы не хотите объединять библиотеки по какой-либо причине (например, иметь debug lib и release lib), вы можете включить разные библиотеки в зависимости от вашей цели сборки.
Если вы откроете свою информацию о проекте (щелкните правой кнопкой мыши по проекту- > Получить информацию или выделите ее и нажмите кнопку информации), а затем перейдите в раздел "Связывание", выделите "Другие флаги компоновщика", а затем нажмите кнопку "Копировать" на в левом нижнем углу экрана один из вариантов - Add Build Setting Condition. Нажатие на это даст вам дочерний параметр в разделе Другие флаги компоновщика, который по умолчанию содержит раскрывающиеся списки для всех SDK и Any Architecture с пустой строкой. Оттуда вы можете установить определенные флаги компоновщика (-lmylib-release-iphonesimulator и т.д.) В зависимости от различных настроек сборки.