2 votes

Comment construire une bibliothèque statique pour armv6, armv7 et i386 ?

J'ai suivi le guide à Construire une bibliothèque statique lourde (dispositif + simulateur) à l'aide de Xcode et du SDK 4+. pour construire la libmms ( https://github.com/kosher-penguin/xcode-libmms ), et j'ai obtenu une grosse bibliothèque statique, mais cela ne semble pas fonctionner. J'ai des erreurs lorsque j'ajoute la bibliothèque à mon projet (xCode4.2+iOS5.0) :

Undefined symbols for architecture armv7:
  "_iconv_close", referenced from:
      _mms_connect in libMMS.a(mms.o)
  "_Status_GetNewStatusByKey", referenced from:
      _report_progress in libMMS.a(mms.o)
  "_Status_SetNewStatusByKey", referenced from:
      _report_progress in libMMS.a(mms.o)
  "_iconv", referenced from:
      _string_utf16 in libMMS.a(mms.o)
  "_iconv_open", referenced from:
      _mms_connect in libMMS.a(mms.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Tout d'abord, je clone le code de https://github.com/kosher-penguin/xcode-libmms.git Deuxièmement, je l'ouvre avec xCode4.2, et j'ajoute la suite script à Run script(Build Phases), puis je lance le projet. Troisièmement, je copie le fichier nommé libmms.a dans le dossier nommé Release-universal, puis j'ajoute la bibliothèque à un nouveau projet. Quatrièmement, dans le nouveau projet, j'ajoute le fichier d'en-tête du projet xcode-libmms, j'importe mms.h et mms_config.h, et j'appelle la fonction mms_connect, puis je le construis, mais je reçois les erreurs.

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}\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO"
xcodebuild -configuration "${CONFIGURATION}" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

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}"
lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"

#########
#
# Added: StackOverflow suggestion to also copy "include" files
#    (untested, but should work OK)
#
if [ -d "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include" ]
then
mkdir -p "${CREATING_UNIVERSAL_DIR}/usr/local/include"
# * needs to be outside the double quotes?
cp "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include/"* "${CREATING_UNIVERSAL_DIR}/usr/local/include"
fi
fi

Veuillez m'aider, merci.

mettre à jour : Après avoir ajouté la bibliothèque libiconv, l'erreur est la suivante :

Undefined symbols for architecture armv7:
  "_Status_GetNewStatusByKey", referenced from:
      _report_progress in libMMS.a(mms.o)
  "_Status_SetNewStatusByKey", referenced from:
      _report_progress in libMMS.a(mms.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

2voto

Codo Points 28685

L'un des problèmes est que votre bibliothèque a une dépendance à l'égard de libiconv . Lorsque vous utilisez votre bibliothèque, vous ne devez pas simplement ajouter libMMS mais libiconv également, qui est fourni avec toute installation de XCode. Voir libiconv ne se lie pas au projet iOS pour savoir comment l'ajouter au projet.

Je ne sais pas quelle dépendance _Status_GetNewStatusByKey y _Status_SetNewStatusByKey . Ils pourraient être similaires.

Mise à jour :

Le deuxième problème est la fonction report_progress() en mms.c qui utilise les fonctions Status_GetNewStatusByKey y Status_SetNewStatusByKey qui ne semblent être définis nulle part (n'avez-vous pas reçu d'avertissement lorsque vous avez compilé la bibliothèque ?) Supprimez tout ce qui déclare, définit ou utilise report_progress() . Il a été supprimé dans la dernière version de libmms de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X