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



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



Введите описание изображения здесь



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



Введите описание изображения здесь



Для спортивного симулятора, а также устройства я ставлю Universal lib и в этом запускаю скрипт this:-
Введите описание изображения здесь



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





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



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



Примечание:



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



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



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

4 ответов:

Другое решение, которое я нашел с 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 для построения всех архитектур.

# 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}/"

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

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

Команда Lipo: lipo-create-output newlibraryname.симуляторлибрариним.в devicelibraryname.a

Интегрированная недавно созданная универсальная статическая библиотека и она работала!!!

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

Введите описание изображения здесь

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

Введите описание изображения здесь

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

TestingLibImport / libLibNSlog.а являются: armv7 armv7s i386 x86_64 arm64

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

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

Просто внесите одно небольшое изменение, как указано ниже, в ваш сценарий aggregate для симулятора, чтобы построить универсальный библиотека -

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 -арка i386 BUILD_DIR= " ${BUILD_DIR}" BUILD_ROOT= "${BUILD_ROOT} "SYMROOT=" ${SYMROOT} "

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

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

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

Comments

    Ничего не найдено.