iOS關於armv7,armv7s,arm64,i386,x86_64

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’錯誤。

    2》在源代碼中,如果編譯器找到他的聲明,卻不知道他怎麼實現的,或者說目標文件裏沒有這個實現,則就會出現鏈接錯誤。

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相關的幾項需要配置正確。

當源碼運行出現這種錯,解決辦法是target-->build setting-->compile sources as 把混編語言改回objective-c 就可以了




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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章