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

Как обновить нашу статическую библиотечную архитектуру для поддержки arm64 Build?

Несколько дней назад я создаю static-library (Universal), которые отлично работают с Xcode5.0 SDK7. После обновления Xcode5.1 с SDK7.1, который не работает, если я выбираю симулятор iPhone Retina(4-inch 64-bit). Затем я собираюсь обновить свою библиотеку с помощью изменения настроек Bellow.

enter image description here

Я делаю то же самое для трех целей: -

enter image description here

Для спортивного симулятора, а также устройства я ставлю Universal lib и в этом я запустил script следующее: - enter image description here

После этого я Build Again lib и используется так, как я сделал До этого в моем проекте. Но по-прежнему возникает проблема с iPhone Retina(4-inch 64-bit) Undefined symbols for architecture x86_64:


Итак, я спрашиваю, есть ли какие-либо дополнительные изменения, необходимые для обновления lib для , либо я сделал ошибку на предыдущем шаге. Пожалуйста, действуйте, если я ошибаюсь.

какие изменения необходимы для обновления моей статической библиотеки для поддержки 64Bit architecture

Примечание:

Я прошу создать собственное обновление библиотеки. Я не использую стороннюю библиотеку. Обновление

Я использовал эту команду lipo -info testingLibImport/libLibNSlog.a для моего терминала, для которой:

Architectures in the fat file: testingLibImport/libLibNSlog.a are: armv7 armv7s i386 arm64 
4b9b3361

Ответ 1

После множества вещей я получил решение. некоторые из xcode не знают, что автоматически появляется Standard architectures (including 64-bit) (armv7,armv7s,arm64), но в моем случае нет опции в моем проекте статической библиотеки. поэтому я собираюсь добавить это вручную как: -

enter image description here

и выберите этот параметр: -

enter image description here

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

testLibImport/libLibNSlog.a: armv7 armv7s i386 x86_64 arm64

Ответ 2

Другим решением, которое я нашел с XCode 6.4, является добавление ONLY_ACTIVE_ARCH = NO и не указывать архитектуру. Итак,

xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

Будет строить архитектуры i386 и x86_64 в вашей библиотеке.


Здесь мой полный универсальный lib запускает script для построения всех архитектур.

# define output folder environment variable
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

# Step 1. Build Device and Simulator versions
xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"

# Step 2. Create universal binary file using lipo
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a"                "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"

# Last touch. copy the header files. Just for convenience
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"

Ответ 3

Я тоже столкнулся с одной и той же проблемой вчера, и после многих поисковых запросов и попыток разного решения я сдался и попробовал сам. Все, что я мог понять из различных решений, было то, что когда я запускал "lipo -info library.a", он не был построен для архитектуры x86_64. Итак, решил отказаться от совокупного подхода и сделал простую попытку.

  • как сообщается в этом посте, я добавил в архитектуру armv7, armv7s и arm64.
  • создать проект статической библиотеки с помощью симулятора iphone (32 бит)
  • создать проект статической библиотеки с помощью симулятора iphone (64 бит)
  • создать проект статической библиотеки с устройством iOS
  • перейти к пути сборки (по производным данным)
  • скопировал как симулятор, так и вывод устройства в общую папку
  • команда lipo в окне терминала для создания универсальной библиотеки

команда lipo: lipo -create -output newlibraryname.a simulatorlibraryname.a devicelibraryname.a

интегрировал вновь созданную универсальную статическую библиотеку, и она РАБОТАЛА!!!

Ответ 4

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

Итак, вот еще один подход, для тех, кто использует обобщенный подход для создания универсальной библиотеки

просто сделайте небольшое изменение, как указано ниже, в вашем агрегате script для симулятора для создания универсальной библиотеки -

xcodebuild -target ProductName -configuration ${CONFIGURATION} -sdk iphonesimulator ARCHS = "i386 x86_64" BUILD_DIR = "$ {BUILD_DIR}" BUILD_ROOT = "$ {BUILD_ROOT}" SYMROOT = "$ { SYMROOT}"

Обратите внимание на включение нескольких архитектур вместо использования подхода с единой архитектурой -

xcodebuild -target ProductName -configuration ${CONFIGURATION} -sdk iphonesimulator -arch i386 BUILD_DIR = "$ {BUILD_DIR}" BUILD_ROOT = "$ {BUILD_ROOT}" SYMROOT = "$ {SYMROOT}"

Просто ARCHS = "i386 x86_64" сделает магию для вас.

Вы можете подтвердить это, используя следующую команду lipo lipo -info newLibraryName.a

Надеюсь, это сэкономит время для многих других, таких как я!