2014-06-21 46 views
24

Statik bir kütüphane yapıyorum. Yapılandırma ayarları, $(ARCHS_STANDARD) olarak ayarlanan Mimariler ayarını Standard Architectures (armv7, armv7s, arm64) olarak gösterir ve IOS Cihazını seçip sonra simülatörü (örneğin iPhone Retina) kullanırım. Ben iki adet olması ŞimdiXcode - symbol (s) mimari için bulunamadı x86_64 (iOS Lib)

, ben kümelenmiş lib oluşturmak için lipo -create kullanmak Debug-iphoneos içeride ve içeride Debug-iphonesimulator diğer (oluşturur: Ben herhangi bir iOS cihazında taklit etmek başka bir projede bu kütüphaneyi kullandıysanız

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

64-bit mimarisi ile, symbol(s) not found for architecture x86_64 veriyor. Lib projesinin kendisi, lib'i kullanan başka bir projeyle birlikte bir çalışma alanının içinde olduğumdan ötürü beni çok kızdırıyor. 64-bit iOS simulatöründe simüle edebilirim (tüm simülatörlerde ve cihazlarda) Ne yapıyorum ?: Neyi yanlış yapıyorum? 10 Notlar: (bu aptal sorunu çözmek için çalışıyor benim ikinci gün olduğundan)

  1. Bunun anlamı beni suçlayarak önce S. çoğaltmak değil, ben Yığın ve Google'da arama yaptı. Bütün cevaplar yardımcı olmuyor.
  2. Xcode 5.1.1 kullanıyorum.
+0

Eğer OS veya Xcode ile gelir lipo kullanıyorsunuz? Xcode'ları kullanmak için "xcrun -sdk iphoneos lipo [daha önce olduğu gibi argümanlar]" komutunu çalıştırın. Belki bu yardımcı olacaktır. – James

+0

Dürüst olmak gerekirse, sorunuzla kafam karıştı, ancak kontrol edilmesi gereken iki şey var: İlk önce "Yapılandırılmamış Mimariler Oluştur" seçeneğinin Evet veya Hayır olarak ayarlanıp ayarlanmadığını görmelisiniz. Evet olarak ayarlanmışsa, o zaman sadece bu cihaz için oluşturuluyor . Eğer HAYIR'ı seçerseniz, herşeyi 3 yapar. İkincisi, Terminal'den "MyLib.a" dosyasını yazabilirim ve size hangi statiklerin sizin statik statik lib'inizde olduğunu söyleyeceğim. – cjserio

+0

"i386 x86_64" seçeneğinin, hedefiniz için "VAILD_ARCHS" oluşturma ayarları altında "arm7 arm7s arm64" ile birlikte listelendiğinden emin olun. – gagarwal

cevap

24

Statik kitaplık oluşturmayla aynı sorunu yaşadım.
Son olarak temel çözümü buldum.Hedefe tıklayın)

enter image description here

1) proje dosyası
2 tıklayın (Sen x86_64/armv7/armv7s/arm64 için evrensel bir kütüphane inşa etmek gerekir)
3) Açık "Build Phases"
4) Açık "Run Script"
5) "/bin/sh" ve

 
########################################## 
# 
# c.f. http://stackoverflow.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: StackOverflow 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 
aşağıdaki komut dosyasını ekleyin 363.210

6) "cmd + ↑") (Finder içinde

enter image description here

8) gidin 1 dizin yukarı "cmd + B" (Build Projesi)

7) Açık Ürünü Hit ve "Release-universal" dizin göreceksiniz . enter image description here

"fat/universal" Kitaplığınız olacak, Devam etmeye hazırsınız!

+1

Bu en iyi cevap. Sadece meraktan, nasıl bir "Sürüm" yapı inşa edebilirsiniz cmd-B kullanarak, cmd-b bir "Hata Ayıklama" sürümü oluşturur. "Sürüm" sürümü oluşturmak için Ürün> Arşiv'i kullanmalıyım –

+5

Yapı yapılandırmasını değiştiriyorum, işte adımlar [1]: http://i.stack.imgur.com/RqWkL.png [2]: http://i.stack.imgur.com/xZayM.png [3]: http: //i.stack.imgur. com/xk5on.png – l0gg3r

+0

teşekkürler, bu benim için problemi çözdü – kevinl

5

lipo aracı şişman mach-o ikililer oluşturabilir kalmaz, ama onları kontrol edebilirsiniz: xcrun lipo -info /path/to/libThing.a

mimariler dosyasında ne bu irade çıktı. Lipo'yu kullanarak ikili dosyalara katılmadan önce, beklediğiniz mimarilerin mevcut olduğundan emin olmak için bunu çalıştırın. Aynı zamanda, yağ ikili birleştirme ürününün üzerinde çalıştırmak için iyi bir fikirdir. Senin durumunda

İhtiyacınız:

iPhoneSDK Yapılandırma: ARMv7, armv7s, arm64

iPhoneSimulator Yapılandırma: i386, x86_64

O iPhoneSimulator ürününü kurmak bir x86_64 üreten değil gibi görünüyor Sorunuza göre ikili. Yapı yapılandırmanızı kontrol edin - özellikle, "Sadece Aktif Mimarileri İnşa Et" (ONLY_ACTIVE_ARCH) NO olarak ayarlanmalıdır. Bu, Sürüm için HAYIR, ancak hata ayıklama için YES olması varsayılan değerdir. EVET ise, yapım ürününde yalnızca bir mimari bulunacaktır.

+0

+1, YES'in benim hatam olduğu hata ayıklama için seçildiğini ima ediyor. –

+1

Bu benim için işe yaramadı :( – swiftBoy

+0

@quellish Denedim ama benim için işe yaramadı – Ramakrishna

0

Uygulama projenize gidin Hedef ve Kütüphane Arama Yolu'nda arayın.

"$(SRCROOT)/MyAppTest/TestFlight" 

sonra sadece eklemek ve projeyi derlemek hiçbir çift tırnak varsa:

Şimdi kütüphane dosyası yolu çift tırnak içinde yazılmalıdır kontrol edin.

Umut sizin için çalışacaktır.

13

Bunu, iPhone Retina 64bit simülatöründe test etmeye çalıştığımda, uygulamalardan birinde kullandığım bir framework lib ile karşılaştım.

Tüm mimarileri her zaman oluşturmak üzere oluşturmak ve oluşturmak için mimarlık olarak x86_64 ekledim. Bir çekicilik yaptı.

enter image description here

+0

Sorunu çözen kolay bir çözüm. (-: – mkk

+2

@ aleksandar-vacic gösterdim yolu denedim ama benim için çalışmıyor – Ramakrishna

+0

Benim için işe yaramadı: / –