1. 程式人生 > >IOS運行報錯 "dyld: Library not loaded" 原因分析

IOS運行報錯 "dyld: Library not loaded" 原因分析

iphone5 edit cpu -o 分析 aud link 編譯 加載

我們的遊戲IOS版在接入易接SDK後,啟動出現如下錯誤

dyld: Library not loaded: @rpath/OnlineAHelper.framework/OnlineAHelper
  Referenced from: /var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/yzg
  Reason: no suitable image found.  Did find:
    /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper: mmap() error 22
at address=0x0349E000, size=0x00014E70 segment=__LINKEDIT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper: mmap() error 22
at address=0x034C6000, size=0x00014E70 segment=__LINKEDIT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper
經過google後找到這個帖子 https://stackoverflow.com/questions/32730312/reason-no-suitable-image-found 裏面給出了一些解決方法,包括清理緩存數據、重新安裝證書等等。一開始我把這些方法幾乎都嘗試了一遍,但還是沒有解決問題。
重新分析問題時,懷疑會不會是編譯目標的CPU架構問題。我的測試機子是iPhone5s + iOS 9.2,編譯目標架構選擇了armv7 用file命令查看易接的庫內容顯示其包含了armv7和arm64兩個版本。iPhone5s是arm64架構的CPU,於是重新編譯選擇了arm64,問題順利解決。 錯誤原因: 32位的庫在加載到64位的機子的iOS9系統後,32位的pagesize由之前的4096字節變成了16384字節,從而導致32位的APP加載的動態庫不能在64位機子運行。 解決的方法有兩種: 1.在動態庫的工程中的other linker flags中加入
-Wl,-segalign,4000
2.將APP升級到支持arm64架構(這也是我們現在的做法) 相關鏈接:https://stackoverflow.com/questions/34707643/32-bit-app-with-dynamic-library-crash-on-64-bit-device

IOS運行報錯 "dyld: Library not loaded" 原因分析