iOS測試分爲模擬器測試和真機測試,處理器分爲32位處理器,和64位處理器,
模擬器32位處理器測試需要i386架構,(iphone5,iphone5s以下的模擬器)
模擬器64位處理器測試需要x86_64架構,(iphone6以上的模擬器)
真機32位處理器需要armv7,或者armv7s架構,(iphone4真機/armv7, ipnone5,iphone5s真機/armv7s)
真機64位處理器需要arm64架構。(iphone6,iphone6p以上的真機)
project -> target -> building setting -> Arhitectures 設置
debug屬性設置爲no的時候,會編譯支持所有架構的版本,編譯的速度會變慢,設置爲yes 的時候,只編譯當前的architecture版本,編譯速度快。
一般情況下,debug 設置爲yes,release爲no,這樣發行版本能適應不同設備,
Undefined symbols錯誤的解決方案整理
.h(聲明文件)<————>.m(實現文件)
.h<————>.c
.hpp<————>.cpp
1》在源代碼中,找不到一個標識符的聲明,無論是變量名,類名,或者是方法名,編譯的時候會得到
Use of undeclared identifier ‘XXX’錯誤。
Undefined symbols for architecture armv7(armv7處理器架構指令集下,符號未定義):
"_XCloseIM", referenced from:
dlib::gui_core_kernel_2_globals::event_handler_thread::~event_handler_thread() in gui_core_kernel_2.o
編譯原理,在源碼詞法分析,語法分析以及編譯的整個過程中,會生成符號表,所有標識符都會放到這個表中。 如果鏈接的時候,找不到具體的實現,就會出現這個錯誤。可能的原因有:
- 引入了需要用到的庫的頭文件,卻沒有鏈接正確的實現庫。因爲Xcode本身所支持的庫是Static Library,即.a的方式,.a的文件裏只有實現,使用的時候需要另外引入頭文件,那麼就有可能把頭文件放進來,沒有放.a或放入了錯誤的版本。
- Build Settings或者Build Phases配置有誤。檢查Build Phases裏的Link Binary With Libraries和Build Settings裏的幾項Search Path。
- 從外部導入的文件沒有加入到特定的target中。這個正是我整理這篇日誌之前遇到的,將.a、.m、.framework等引入到工程當中,卻沒有勾選當前Build的target,會出現這個問題,可以選中特定的文件,在右側邊欄中選中target。
- 未包含處理器架構指令集的問題。報錯時的提示一般都是“Undefined symbols for architecture armv7”之類的,而“for architecture armv7”就是說沒有支持armv7,在Build settings裏architecture相關的幾項需要配置正確。
Undefined symbols for architecture armv7:
"_UIApplicationMain", referenced from:
_main in main.o
"_OBJC_CLASS_$_UIResponder", referenced from:
_OBJC_CLASS_$_AppDelegate in AppDelegate.o
"_OBJC_METACLASS_$_UIViewController", referenced from:
_OBJC_METACLASS_$_ViewController in ViewController.o
"_OBJC_CLASS_$_UINavigationController", referenced from:
objc-class-ref in AppDelegate.o
"_OBJC_CLASS_$_UIWindow", referenced from:
objc-class-ref in AppDelegate.o
"_OBJC_CLASS_$_UIScreen", referenced from:
objc-class-ref in AppDelegate.o
"_OBJC_METACLASS_$_UIResponder", referenced from:
_OBJC_METACLASS_$_AppDelegate in AppDelegate.o
"_OBJC_CLASS_$_UIViewController", referenced from:
_OBJC_CLASS_$_ViewController in ViewController.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)