Как избавиться от предупреждения "файл был создан для неподдерживаемого формата файла" при связывании со статической библиотекой?

У меня есть приложение, которое включает в себя внешнюю библиотеку, которую я разработал, и я получаю следующее предупреждающее сообщение каждый раз, когда компилирую с помощью устройства в качестве цели:

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 и т.д.) В зависимости от различных настроек сборки.