ios xcode5 64bit static-libraries

Xcode: no se encontraron símbolos para la arquitectura x86_64(iOS Lib)



xcode5 64bit (4)

Encontré esto con una biblioteca de marco que estoy usando en una de mis aplicaciones, cuando intenté probarlo en el iPhone Retina 64bit simulator.

Simplemente agregué x86_64 como una arquitectura para construir y configurarlo para que siempre se construya para todas las arquitecturas. Trabajó un encanto.

Estoy construyendo una biblioteca estática. La configuración de compilación tiene las Arquitecturas configuradas en: $(ARCHS_STANDARD) que se muestra como Standard Architectures (armv7, armv7s, arm64) . Construyo la biblioteca eligiendo el dispositivo iOS Y luego usando el simulador (por ejemplo, iPhone Retina).

Ahora que tengo dos compilaciones (una dentro de Debug-iphoneos y la otra dentro de Debug-iphonesimulator , uso lipo -create para crear la lib agregada:

lipo -create path/to/first/lib /path/to/second/lib -o MyLib.a

Si usé esta biblioteca en otro proyecto para simular en cualquier dispositivo iOS con una arquitectura de 64 bits, da el symbol(s) not found for architecture x86_64 . Lo que realmente me enoja tanto que el proyecto lib en sí mismo está dentro de un espacio de trabajo con otro proyecto que usa lib. ¡Puedo simular en el simulador de iOS de 64 bits! (en todos los simuladores y dispositivos para el caso). ¿Qué estoy haciendo mal?

Notas:

  1. Esto no es duplicado Q. Antes de acusarme de eso (ya que este es mi segundo día tratando de solucionar este problema estúpido), busqué en Stack y Google. Todas las respuestas no ayudan.
  2. Estoy usando Xcode 5.1.1.

La herramienta lipo no solo puede crear binarios de mach-o fat, sino que también puede inspeccionarlos: xcrun lipo -info /path/to/libThing.a

Esto dará salida a las arquitecturas que están en el archivo. Antes de unirse a los binarios utilizando lipo, ejecute esto para asegurarse de que las arquitecturas que espera están presentes. También es una buena idea ejecutar esto en el producto de una combinación binaria grasa.

En tu caso necesitas:

Configuración de iPhoneSDK: armv7, armv7s, arm64

Configuración del simulador de iPhone: i386, x86_64

Parece que el producto de compilación de iPhoneSimulator no produce un binario x86_64 basado en tu pregunta. Verifique la configuración de su compilación, en particular, "Construir solo arquitecturas activas" ( ONLY_ACTIVE_ARCH ) debe configurarse en NO. El valor predeterminado es NO para la versión, pero SÍ para la depuración. Si es SÍ, solo una arquitectura estará en el producto de compilación.


Tuve el mismo problema con la construcción de la biblioteca estática.
Finalmente he encontrado la solución básica. (Necesitas construir una biblioteca universal para x86_64 / armv7 / armv7s / arm64 )

1) Haga clic en el archivo del proyecto.
2) Haga clic en el objetivo.
3) Abrir "Build Phases"
4) Abra "Run Script"
5) Agregue "/bin/sh" y el script a continuación

########################################## # # c.f. http://.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4 # # Version 2.7 # # Latest Change: # - Supports iPhone 5 / iPod Touch 5 (uses Apple''s workaround to lipo bug) # # Purpose: # Automatically create a Universal static library for iPhone + iPad + iPhone Simulator from within XCode # # Author: Adam Martin - http://twitter.com/redglassesapps # Based on: original script from Eonil (main changes: Eonil''s script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER) # set -e set -o pipefail #################[ Tests: helps workaround any future bugs in Xcode ]######## # DEBUG_THIS_SCRIPT="false" if [ $DEBUG_THIS_SCRIPT = "true" ] then echo "########### TESTS #############" echo "Use the following variables when debugging this script; note that they may change on recursions" echo "BUILD_DIR = $BUILD_DIR" echo "BUILD_ROOT = $BUILD_ROOT" echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR" echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR" echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR" echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR" fi #####################[ part 1 ]################## # First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it) # (incidental: searching for substrings in sh is a nightmare! Sob) SDK_VERSION=$(echo ${SDK_NAME} | grep -o ''./{3/}$'') # Next, work out if we''re in SIM or DEVICE if [ ${PLATFORM_NAME} = "iphonesimulator" ] then OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION} else OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION} fi echo "XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})" echo "...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}" # #####################[ end of part 1 ]################## #####################[ part 2 ]################## # # IF this is the original invocation, invoke WHATEVER other builds are required # # Xcode is already building ONE target... # # ...but this is a LIBRARY, so Apple is wrong to set it to build just one. # ...we need to build ALL targets # ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!) # # # So: build ONLY the missing platforms/configurations. if [ "true" == ${ALREADYINVOKED:-false} ] then echo "RECURSION: I am NOT the root invocation, so I''m NOT going to recurse" else # CRITICAL: # Prevent infinite recursion (Xcode sucks) export ALREADYINVOKED="true" echo "RECURSION: I am the root ... recursing all missing build targets NOW..." echo "RECURSION: ...about to invoke: xcodebuild -configuration /"${CONFIGURATION}/" -project /"${PROJECT_NAME}.xcodeproj/" -target /"${TARGET_NAME}/" -sdk /"${OTHER_SDK_TO_BUILD}/" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" BUILD_DIR=/"${BUILD_DIR}/" BUILD_ROOT=/"${BUILD_ROOT}/" SYMROOT=/"${SYMROOT}/" xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}" ACTION="build" #Merge all platform binaries as a fat binary for each configurations. # Calculate where the (multiple) built files are coming from: CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator echo "Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}" echo "Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}" CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal echo "...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}" # ... remove the products of previous runs of this script # NB: this directory is ONLY created by this script - it should be safe to delete! rm -rf "${CREATING_UNIVERSAL_DIR}" mkdir "${CREATING_UNIVERSAL_DIR}" # echo "lipo: for current configuration (${CONFIGURATION}) creating output file: ${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" xcrun -sdk iphoneos lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}" ######### # # Added: suggestion to also copy "include" files # (untested, but should work OK) # echo "Fetching headers from ${PUBLIC_HEADERS_FOLDER_PATH}" echo " (if you embed your library project in another project, you will need to add" echo " a "User Search Headers" build setting of: (NB INCLUDE THE DOUBLE QUOTES BELOW!)" echo '' "$(TARGET_BUILD_DIR)/usr/local/include/"'' if [ -d "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}" ] then mkdir -p "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}" # * needs to be outside the double quotes? cp -r "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"* "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}" fi fi

6) Pulse "cmd + B" (Proyecto de compilación)

7) Abrir producto en Finder

8) Navegue por el directorio 1 hacia arriba ("cmd + ↑"), y verá "Release-universal" directorio "Release-universal" .

Habrá su biblioteca "fat/universal" , ¡Está listo para comenzar!


Vaya al objetivo de su proyecto de aplicación y busque en la Ruta de búsqueda de la biblioteca .

Ahora compruebe que la ruta de su archivo de biblioteca debe escribirse entre comillas dobles:

"$(SRCROOT)/MyAppTest/TestFlight"

Si no hay comillas dobles, solo agréguelas y compile el proyecto.

Espero que funcione para usted.