標籤:64位適配 ios pbxproj 編譯失敗 xcode編譯設定
程式從32bit轉到64bit總結:一、出現各種 “
OBJC_CLASS$_ShareSDK”, referenced from:
解決方案:
網上版本:
- 選中Targets—>Build Settings—>Architectures。
把build active architectures only 改為 NO。
- 把最下面的Valid Architectures中的arm64參數刪掉就可以了(但這樣不是反倒不支援64位了?)
或者:
- 雙擊Architectures,選擇other,刪除$(ARCH_STANDARD),然後增加armv7和armv7s(寫上:$(ARCHS_STANDARD_32_BIT))。
- clean 再build。
個人解決方案:
Build Settings -> Other Linker Flags -> 加入 -all_load
二、編譯時間發生錯誤:
clang: error: no such file or directory: ‘Foundation’
clang: error: no such file or directory: ‘AdSupport’
既然都是編譯時間問題那麼就應該看一下應用的編譯設定檔案
查看程式中的編譯檔案project.pbxproj:
查看方法:-> 找到程式的:程式名.xcodeproj檔案-> 右鍵顯示包內容-> project.pbxproj
先看一下編譯引用路徑有沒有問題:
2B82218A1B759BF400BDEFB7 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework;path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; };
檔案指標isa也沒有問題。粗略分析下這串字串的意思:最前面的2B82218A1B759BF400BDEFB7 (我一開始以為應該是檔案的MD5值,但後來發現這個值是會變的。所以應該不是,具體是什麼有興趣再來研究研究。)isa為檔案的參考關聯性指標。path就是庫檔案的相對位址了。而sourceTree應該就是尋找庫檔案的根目錄。
這裡因為是iOS所以根目錄都是指向SDK的存放位置。如果是自己的檔案則應該都是`"<group>"`。
路徑檔案也沒有任何問題:
在path = System/Library/Frameworks/AdSupport.framework;路徑下能找到該庫
在Build Phases -> Link Binary With Libraries 也正常匯入。
檔案目錄下也沒有任何紅色標記。
在查看編譯標記的時候發現了主要問題:
"-framework",UIKit,Foundation
“-framework”,這裡使用的編譯標記不對啊。刪去Foundation或者在Foundation前加”-framework”。所以總結了下原因應該是在使用Build Setting -> Other Link Flags的時候使用不當,因為Other Link Flags設定結果就是直接關聯到這部分的內容。
三、資料類型的轉換
(PS:改這部分真是讓我覺得我就是個搬運工。。。累覺不愛)
- int -> NSInteger
- unsigned -> NSUIntege
- float -> CGFloat
- 還有numberWithInt也基本要改成numberWithInteger等等
…….
四、project.pbxproj檔案的介紹PBXBuildFile與PBXFileReference
PBXBuildFile與PBXFileReference這兩個section儲存中工程檔案相關的資訊:包含檔案的類型,路徑,名稱等
/* Begin PBXBuildFile section */ 2B82218D1B75AC8800BDEFB7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B82218C1B75AC8800BDEFB7 /* Foundation.framework */; };/* End PBXBuildFile section *//* Begin PBXFileReference section * F60CC2A014D4EA0500A005E4 /* SocketOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; sourceTree = <group>; };/* End PBXFileReference section */
PBXGroup
這個section儲存著工程檔案的分組資訊:分組的名稱,以及該組內含有的檔案,比如下面的例子,一個EGOTableViewPullRefresh分組裡面還有一個children子分組,同時該組包含EGORefreshTableHeaderView的.h和.m兩個檔案,該分組對應的相對路徑為../Classes/EGOTableViewPullRefresh
E1B4A9DE12FC8B1000EB3F67 /* EGOTableViewPullRefresh */ = { isa = PBXGroup; children = ( E1B4A9DF12FC8B1000EB3F67 /* EGORefreshTableHeaderView.h */, E1B4A9E012FC8B1000EB3F67 /* EGORefreshTableHeaderView.m */, ); name = EGOTableViewPullRefresh; path = ../Classes/EGOTableViewPullRefresh; sourceTree = "<group>"; };/* End PBXGroup section */
PBXNativeTarget
該section儲存工程建立的target資訊:包含target的對應的配置資訊、建立規則、依賴、名稱和類型等資訊
/* Begin PBXNativeTarget section */ 1D6058900D05DD3D006BFB54 /* MyBaby */ = { isa = PBXNativeTarget; buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "MyBaby" */; buildPhases = ( 1D60588D0D05DD3D006BFB54 /* Resources */, 832D4F01120A6F7C001708D4 /* CopyFiles */, 1D60588E0D05DD3D006BFB54 /* Sources */, 1D60588F0D05DD3D006BFB54 /* Frameworks */, 79289B3ECCA2441197B8D7F6 /* Copy Pods Resources */, ); buildRules = ( ); dependencies = ( ); name = MyBaby; productName = WordPress; productReference = 1D6058910D05DD3D006BFB54 /* My Baby.app */; productType = "com.apple.product-type.application"; };/* End PBXNativeTarget section */
XCBuildConfiguration與XCConfigurationList
這兩個section儲存著工程相關的配置資訊:下面對應的是debug模式下的配置資訊,可以看到裡麵包含CODE_SIGN_IDENTITY,sdk,framework的搜尋路徑等資訊。
/* Begin XCBuildConfiguration section */ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = EBC24772E5CD4036B5AFD803 /* Pods.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; CODE_SIGN_ENTITLEMENTS = ""; CODE_SIGN_IDENTITY = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_THUMB_SUPPORT = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; IPHONEOS_DEPLOYMENT_TARGET = 7.0; ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = "-Wno-format-security"; OTHER_LDFLAGS = ( "-lxml2", "-licucore", ); PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; VALID_ARCHS = "armv7 arm64 armv7s"; }; name = Release; };/* End XCBuildConfiguration section *//* Begin XCConfigurationList section */ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "MyBaby" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, 2F30B4C10E342FDF00211B15 /* Distribution */, 83D3E0201215F89F00600B4B /* Beta */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; };/* End XCConfigurationList section */
通過上面分析一個pbxproj檔案的過程可以看出,要建立一個工程,首先需要添加相關的檔案,然後設定需要產生的target以及對應的配置資訊就行了。
總結
如果編譯時間出錯,除文法上的出錯,我們需要檢查工程設定檔案的部分主要就是檢查這些部分在原理上的設定是否正確。根據提示資訊去查看相應的內容。就比如我這裡遇到的:clang: error: no such file or directory: ‘Foundation’,就應該去檢查PBXBuildFile、PBXFileReference和XCBuildConfiguration項。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
iOS程式支援64位以及project.pbxproj檔案的介紹