sdk編譯出ipk缺依賴
1. 微信支付sdk接入依賴沖突
接入錯誤。當導入微信的支付SDK時,不會發生沖突,但是因為librarysearchpaths裡面ShareSDK裡面的微信SDK在前面,這就導致覆蓋了我們導入的微信SDK,會導致出現接入依賴沖突的問題,微信是騰訊公司於2011年1月21日推出的一個為智能終端提供即時通訊服務的免費應用程序。
2. linux下編譯IPK軟體包出現錯誤,麻煩幫忙看一下是什麼問題
1、configure,這一步一般用來生成Makefile,為下一步的編譯做准備,你可以通過在configure後加上參數來對安裝進行控制,比如代碼:./configure--prefix=/usr上面的意思是將該軟體安裝在/usr下面,執行文件就會安裝在/usr/bin(而不是默認的/usr/local/bin),資源文件就會安裝在/usr/share(而不是默認的/usr/local/share)。同時一些軟體的配置文件你可以通過指定--sys-config=參數進行設定。有一些軟體還可以加上--with、--enable、--without、--disable等等參數對編譯加以控制,你可以通過允許./configure--help察看詳細的說明幫助。2、make,這一步就是編譯,大多數的源代碼包都經過這一步進行編譯(當然有些perl或python編寫的軟體需要調用perl或python來進行編譯)。如果在make過程中出現error,你就要記下錯誤代碼(注意不僅僅是最後一行),然後你可以向開發者提交bugreport(一般在INSTALL里有提交地址),或者你的系統少了一些依賴庫等,這些需要自己仔細研究錯誤代碼。3、makeinsatll,這條命令來進行安裝(當然有些軟體需要先運行makecheck或maketest來進行一些測試),這一步一般需要你有root許可權(因為要向系統寫入文件)。
3. iOS開發:SDK依賴第三方庫及其踩過的坑
公司開發的SDK,是集成了各個平台的商品,包括購買、分享、提現等功能,為了加快進度,我是使用了一些第三方。但是有些需求,比如分享到微信朋友圈或者還有,必須用到微信的SDK。考慮到後期的維護成本和集成,筆者採用了cocoapods管理第三方庫。
筆者有片文章專門介紹SDK的開發步驟的,大家可以參考,我這里就直接進入主題了。
首先,你創建一個靜態的framework工程MyTestSDK,把這個工程集成cocpapods,至於如何集成cocpapods,網上有教程,自己搜索。這個時候把你項目中所用的第三方庫添加到Podfile文件中,然後 pod install。這個時候你command + B 編譯運行,如果你的第三方庫中還有Bundle資源,那麼編譯後,第三方庫的bundle資源會被編譯,一起放到Procts文件下的framework文件中,右鍵Show in Finder就會看到。如下圖所示的MBProgressHUD文件夾,裡面都是MBProgressHUD第三方的資源文件。
然後把你的項目放入SDK工程中,編譯運行一下,看看有沒有錯誤。之所以先把SDK工程選用cocoapods管理,就是怕你的項目放入SDK中運行報錯。沒有任何問題,直接編譯即可。
由於SDK中的第三方是通過cocoapods管理的,所以接入者的項目也要用cocoapods管理。
1:把SDK工程中,Procts文件夾下的framework文件到項目中,最好項目中建立一個文件夾,專門放SDK和bundle。我是放到了一個文件夾中,方便分類尋找。如下圖所示:
2:打開終端,cd到SDK所在的文件夾下,執行如下命令,回車,創建spec文件。
其中,MyTestSDK是你的SDK名稱。
創建出來的spec文件,是個很長的文件,但是大部分都是注釋的,我這里只提取了有用的信息展示出來:
然後把spec中依賴的第三方庫,逐個加入到項目中的Podfie文件中。然後 終端打開,cd到自己的項目中,pod install即可。
本人親自測試過的,No Problem。當初感覺SDK如果依賴了第三方庫,接入的項目中也有同樣的第三方庫,會不會沖突啊,感覺好難搞啊。事實證明,通過spec進行依賴,可以很好的解決這個問題,也就沒有那麼麻煩了。
首次開發SDK還是遇到了很多問題,運行出現很多bug,但是最後還是一一解決了,就是沒有記錄下bug和解決發的方法。
1;path路徑不對,就會報錯 ,如下
是因為我把路徑寫成了:
其實正確的寫法是:把「/」放在前面
2:SDK中有第三方,但是項目中的Podfile裡面沒有這個第三方,報錯如下所示:
解決辦法是就是在項目中的 Podfile裡面加入缺失的第三方庫,重新 pod install。
4. 【路由器】OpenWrt 手動編譯 ipk
.ipk 文件是可以通過 OpenWrt 的包管理軟體 opkg 直接安裝,好比 .deb 文件與 apt 的關系。雖然官方的軟體倉庫已經很豐富了,但是有時仍然需要從源碼編譯一些第三方的軟體使用,例如銳捷認證等
但是由於路由器平台通常與常用的伺服器或者個人 PC 的處理器架構不同,並且路由器的處理器本身性能較弱,幾乎不可能直接在路由器上進行編譯生成 .ipk 文件,因此需要交叉編譯來實現
而官方的 OpenWrt 倉庫就提供了一個方便使用的交叉編譯環境
以 Debian / Ubuntu 為例,參考 官網給出的要求 ,可以通過下面命令來進行安裝依賴包
安裝/更新好這些依賴之後,就可以通過 git 拉取 OpenWrt 倉庫了
通常由於倉庫較大以及網速問題,可能會需要很久,其實可以通過 --depth 來限制拉取的倉庫深度,或者通過鏡像站來加速拉取,當然也可以兩者同時採用
進入 openwrt 倉庫後,首先需要更新軟體包列表 feeds ,它是在 OpenWrt 中共用位置的包的集合。運行以下命令即可更新內置軟體包列表並鏈接到編譯工具中:
通常使用圖形化菜單界面來進行配置編譯選項,依次配置處理器架構、具體的處理器型號以及設備
以小米 mini 路由器為例,應該將他們配置成如下圖所示
這一步就是獲取對應設備交叉編譯所需的編譯鏈
可以先搜索有沒有已經配置好的含有 Makefile 的倉庫,有了適配過的 Makefile 文件就可以很方便的來編譯源碼生成 .ipk 文件了
以 minieap 為例, github 上有已經完成的倉庫,依次可以直接拉取來編譯
在拉取完成倉庫後,就可以再次配置編譯選項,將需要編譯成 .ipk 的功能配置成模塊編譯,也就是標記成 M
對於 minieap 來說,在 Network 找到對應選項並配置成 M 即可,如下圖
配置完成後就可以進行編譯了,編譯命令也很簡單,以 minieap 為例如下所示
編譯完成後, .ipk 文件會生成在 ./bin/packages/<YourArchitecture>/base 目錄下,將其拷貝到路由器上就可以通過 opkg 進行安裝使用了
5. Openwrt 編譯ipk出錯,如下錯誤,怎麼解決 denghuinow@Ubuntu:
程序包有問題,或者缺少其他依賴包,感覺,建議不成熟見諒
6. openwrt最大連接數內存
成為第157位粉絲
64m及以上。
要確定硬體支持,主要是主晶元是否支持,然後再看快閃記憶體和內存是否夠用,如果不夠,把內存換好之後再換快閃記憶體,一般先用編程器把OPENWRT刷入快閃記憶體再焊到板上。
openwrt默認沒有rtl8111專屬的r8168驅動,默認使用r8169驅動兼容。但是用iperf3實測內網只能跑滿880m而且速度不太穩定。可以用openwrt官方系統直接下載對應sdk去編譯,編譯出來ipk安裝後重啟。
7. iOS SDK開發中的情形
iOS SDK開發就是為某一個應用場景、或領域、或需求,提供一個已實現的、封裝好的、可供直接使用的模塊。
其主要由兩部分組成:用來為類型或常量聲明的頭文件列表、具體實現的二進制文件。
所以SDK開發中的主要問題點集中在:
1. 頭文件是否能被使用的工程索引到
2. 二進制文件是否能被使用的工程搜索到
本篇文章不寫製作SDK的具體步驟,僅僅討論製作SDK時的一些情形。
SDK開發中關於頭文件設置:
凡是提供給外界使用的類、結構體、枚舉、常量等,定義它們的頭文件必須要在工程的Build Phases->Headers->public下面。並且這些頭文件都需要包含在與SDK工程同名的頭文件中(這條不是必須,只是這么做會顯得更加規范。別人使用SDK的時候,只需要引入SDK同名的頭文件即可)
設置庫文件生成動態的還是靜態的:
Project Name->Target Name->Build Settings->搜索框搜「Mach」->修改「Mach-O Type」為動態或靜態,則相應可生成動態或靜態的庫文件。
先解釋說明以下圖片中出現的工程名字:
SDKDemo :製作的向外提供的SDK庫文件(與SDK工程名同名)
SDKApp :引用SDK庫文件(本文指的是SDKDemo)的App工程
SDKStatic :新建工程時,選擇iOS->Framework & Library->Cocoa Touch Static Library. 用來生成.a文件的工程
SDKFramework : 是個Framework庫文件(可能是動態的,也可能是靜態的),用於模擬被SDK依賴的.framework文件
下面分幾種情況來討論SDK開發的注意事項:
1. 生成動態SDK庫文件。
創建工程的時候,根據默認配置編譯是生成動態庫的。
App工程中引入動態庫的時候,需要在
App工程:Project Name->Target Name->General->Embedded Binaries下添加引入的動態庫。否則運行時會報如下類型錯誤:
嵌入動態庫編譯後,生成的App文件中會多一個Frameworks目錄(可右鍵.App文件查看包內容),裡面全是Embedded Binaries下添加的動態庫
2. 打包為靜態庫
SDK工程:Project Name->Target Name->Build Settings->搜索框搜「Mach」->修改「Mach-O Type」為靜態庫
App工程引入靜態庫很簡單,直接引入就行,不需要額外配置:
tips:
合並真機與模擬器版本時的命令格式為:
lipo -create 模擬器版本的路徑 真機版本的路徑 -output 合並後的版本存放路徑
1. 合並時lipo -create接收的模擬器版本和真機版本兩個參數的前後順序沒有關系,合並後的版本通過命令查看架構信息顯示結果是完全一致的。模擬器架構信息顯示在前,真機架構信息在後。
2. 合並後的版本無論替換真機版本的Framework中的目標文件還是模擬器版本的Framework中的目標文件,App工程中引入被替換的Framework後在真機和模擬器上都能跑起來
首先創建SDKStatic工程,生成一個.a文件。
該工程只是簡單繼承了UIButton,並重寫了initWithFrame方法。為每一個MyButton對象默認生成標題和背景色:
生成的.a文件如下,可以看到裡麵包含了MyButton.o文件:
在SDK工程中引入.a文件。下面分兩種情況來看生成的SDK庫文件:
1. SDK庫文件做成動態庫(設置方法看開頭部分)
.a文件內容被整合進了SDK動態庫文件中,引入App工程中時,只需要引入SDK動態庫就可以了
2. SDK庫文件做成靜態庫(設置方法看開頭部分)
包中的信息:
.a文件內容同樣被整合進了SDK靜態庫文件中,這個更好理解。引入App工程中時,只需要引入SDK靜態庫就可以了
總結下:
製作SDK庫時,如果有依賴的.a文件,則最終生成的SDK庫文件會合並.a文件的內容,而不論SDK庫文件是動態還是靜態的。
下面的SDKFramework是個Framework庫文件(可能是動態的,也可能是靜態的)
SDKFramework工程添加的內容和SDKStatic工程是一樣的。也是自定義MyButton,默認生成標題和背景色(拷貝文件到工程):
SDKDemo工程自定義了MyView,默認生成的MyView對象添加了一個MyButton按鈕和背景色:
1. 如果.framework文件是動態庫
a. SDK打包為靜態庫,如下:
靜態SDK包和動態SDKFramework.framework文件是彼此獨立的。引入靜態SDK包時,必須也導入SDKFramework.framework,否則編譯不過,因為靜態包有引入動態庫中的符號。
b. SDK打包為動態庫,如下:
兩者還是彼此獨立的。動態SDK包中會記錄依賴的動態.framework rpath,App運行時,dyld會根據這個信息去載入對應的.framework依賴文件。如果找不到App將會在啟動時奔潰...
2. 如果.framework文件是靜態庫
a. 首先SDK打包為動態庫看看:
經實踐,依賴的靜態庫會被整合進動態SDK包自身中。App中引入時,只需要導入SDK包就可以。我們在SDKApp中導入SDKDemo,運行可以看到如下效果:
b. 再看看SDK打包為靜態庫:
根據上面截圖中信息,App中導入SDK包時,也必須導入依賴的.framework了。否則編譯時將會出現如下圖所示找不到符號的錯誤:
追加導入依賴的.framework,再次編譯運行。OK!!!
總結:
1. 依賴的.framework為動態庫
製作的SDK庫文件不論動態還是靜態的。和依賴的.framework文件本身是彼此獨立的,不會發生符號整合的現象
2. 依賴的.framework為靜態庫
如果製作的SDK庫文件是動態的,則依賴的.framework靜態庫內容會被整合進SDK庫文件中
如果製作的SDK庫文件是靜態的,則彼此是獨立的
這里又得分幾種情況討論:
1. Podfile中不使用use_frameworks! pods庫生成的是.a文件
a. 如果SDK製作成靜態庫:
SDK靜態庫不會整合Pods里三方庫中的符號,最終導入App工程時,需要SDK靜態庫、Pods中的三方庫文件一起導入
b. 如果SDK製作成動態庫:
Pods庫中的符號會被合並整合進入SDK庫中,導入工程時,只需要導入SDK包就OK了
2. Podfile中使用use_frameworks! pods庫生成的是.framework文件。其中Pods_工程名.framework文件是個靜態庫,管理的第三方庫生成的是framework動態庫
a.如果SDK製作成動態庫:
SDK中會包含引入三方庫的rpath,App中引入SDK包時,也必須引入三方庫,否則dyld載入不了指定庫導致App啟動時奔潰
b. 如果SDK製作成靜態庫:
靜態SDK中會忽略Pods中的庫中定義的符號(也即彼此是獨立的)。如果靜態SDK中引用了動態pods庫中定義的符號,只要在App工程中也導入pods中動態庫,並在embeded binaries中添加。一樣是可以編譯運行的。
其實怎麼編譯,SDK工程中是個什麼情形都不重要。重要的是要明白庫文件的本質,及它是如何發揮作用的?在什麼階段發揮作用?然後學會查看編譯運行時的報錯信息,並配合使用otool、nm、lipo、ar、file等這些命令去查看庫文件的一些信息,最終追蹤定位到問題。
原諒我最後都沒怎麼貼圖了,因為流程都和前面差不多。我也寫的手累了。如果你還有什麼疑惑可以在下面評論,我會盡量及時回復。
8. openwrt-SDK編譯成功但找不到ipk
解壓之後就是OpenWrt-SDK-ar71xx-for-linux-i686-gcc-4.6-linaro_uClibc-0.9.33.2,此目錄結構跟openwrt的目錄結構基本一致
[cpp] view plain
song@song-virtual-machine:attitude_adjustment# ls bin/ar71xx/OpenWrt-SDK-ar71xx-for-linux-i686-gcc-4.6-linaro_uClibc-0.9.33.2
bin Config.in docs include logs package Packages.gz rules.mk staging_dir tmp
build_dir dl feeds.conf.default LICENSE Makefile Packages README.SDK scripts target
[cpp] view plain
song@song-virtual-machine:attitude_adjustment# ls
bin build_dir dl feeds.conf.default LICENSE Makefile README scripts target toolchain
BSDmakefile Config.in docs feeds include
9. iOS 編譯報錯怎麼辦
1.編譯iPad真機時,選擇了 Architetures:Standard(armv6) BaseSDK:iPhoneDevice3.2 TargetDeviceFamily:iPad.
若編譯出現如下錯誤:
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1
則修改 GCC4.2CodeGeneral區域中的ComplieForThumb為非選中.
已經有了開發者證書及私鑰後,可直接在越獄的手機上調試.
2. 編譯鏈接時, "_OBJC_CLASS_$_xxx", referenced from:可能需要重新建立某個類的文件.
或者:選擇項目名,在detail列表中的target列(顯示為一個又圓圈),把這個文件的復選選中,或者再次選中.以把它加入到這個target裡面來.
3.在sdk4.0及以上使用RegexKitLite報'captureCount' was not declared in this scope錯誤,是在非.m文件中使用了它的原因.
4.there is no sdk with the name or path.
從網上down的開源代碼,結果運行的時候常出現這樣的錯,並且在deployment中沒有iosdeploymenttarget選項.
嘗試 Project/Edit Active Target/ 及 Set Active SDK菜單項,來回切換一下Active Configuration。
5. EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION錯誤,意味著這個app有內存管理的問題,一般是因為訪問野指針對象造成的。
一個和內存相關的崩潰一般很難定位到源代碼,因為這個惡魔可能很早就在程序中做了壞事了。假如一段有問題的代碼混亂了內存結構,這樣產生的蝴蝶效應可能會在之後很久才表現出來,並且總在不同的地方。所以,若有指針類型出現了不可能的變化,很可能就是因為內存結構被野指針調用混亂了。
修復一些警告後,可能就能預防一些內存錯誤。警告在左邊靠近行號的黃色三角指出一個編譯警告,你點擊那個黃色的三角形,xcode可能會彈出一個「Fix-it」的建議。
EXC_BAD_ACCESS崩潰不像SIGABRT,將不會得到很明朗的錯誤消息。然而可以使用一個讓人看到曙光的調試工具:Zombies!死亡對象工具。打開這個項目的scheme editor,選擇Run 選項,然後選擇Diagnosics標簽。勾上Enable Zombie Objects選項。當這個zombie工具被啟用之後,即使這個對象被釋放了,這個對象的內存也不會被清理。所以,那塊內存將會被標記為「長生不死的」。假如你試著之後又去使用這塊內存,這個app能夠意識到你的錯誤操作,並且app將會拋出「messagesent to daellocated instance」錯誤並且終止運行。
在工程中加入NSZombieEnabled 環境變數,並設為啟用,則在 EXC_BAD_ACCESS 發生時,XCode 的 Console 會列印出問題描述中,設置方法:雙擊Executables 下的 可執行模組,在彈出窗口中,Variables to be set in the environment,添加 NSZombieEnabled,並設定為 YES,點擊選中復選框啟用此變數。
可以再加入 MallocStackLogging 來啟用malloc記錄,以獲得更多的提示來幫助定位問題。
在gdb窗口輸入 (格式: shell malloc_history <id> <address>) shellmalloc_history1436 0x5f7fcf0, 也可以在終端中去運行 就要去掉以上的shell 指令 如 malloc_history <id> <address>
應該僅當需要調試內存時,才設置上述環境變數。
注意一點:不應該一直啟用zombie objects。因為這個工具將永遠不會釋放內存,只是簡單標記一下這個內存是不死的,你最終將會在某個時候耗盡所有的內存,因為所有分配過的內存都不會得到重用。因此應該在排查內存相關的錯誤的時候才開啟zombie objects,其他時候應該關閉它。
在xcode4中,To edit environment variables, go to Menu Proct / Edit Scheme…, select the desired configuration (you probably want 'Run') from the left sidebar first and then click on the Arguments tab. Environment variables are configurable there.
6.運行一個IPhone程序時,彈出窗口說「程序運行失敗,預置描述文件已過期」 。 解決辦法是,在Xcode中, window-> Orgnazier -> 你的iphone ->刪除帶有紅*的該程序之前的Profile 。 然後從Xcode運行該程序.
7.真機編譯時報 Code Sign error: The identity doesn't match any valid certificate/private key pair in the default keychain
修改工程和Targets的get infouild 中的code signing identity為空
8.調試列印
CFShow(coreFoundationThingy) will print out a description of coreFoundationThingy to the console. Output looks something like: {value = w:1186.000000 h:687.000000 type = kAXValueCGSizeType}
If NSLog() is printing something out as an NSCFType, try CFShow().
9. 編譯時報 Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1,修改C/C++ Compiler Version為gcc4.2
10.this class is not key value coding-compliant for the key viewController
可能在創建了一個基於view的工程,而後把生成的viewcontroller刪除了,但是在.xib中還有對它的引用,在IB中直接用delete鍵刪除掉它就行了。
11.這台電腦上已經存在一個名為「embedded.mobileprovision」的預置文件,您是否要替換么?
http://blog.sina.com.cn/s/blog_6907b67f0100o2vw.html
12.真機調試時報failed to upload *.app
http://hi..com/%CB%E6%B7%E7_1989/blog/item/9649f49f805f05aec8eaf466.html
http://www.shouyanwang.org/thread-462-1-1.html
13.記的release時,先置delegate為nil。
一個節點不應該保留任何對不屬於它的節點的引用。
14.模擬器
將xcode升級到4.3.1以後發現,ipad的模擬器,沒有Home鍵了。Command+Shift+H就可以實現類似點擊Home鍵的效果了。
10. openwrt編譯ipk時怎麼找到模塊
編譯的時候
以下為網友遇到的問題
Package helloworld is missing dependencies for the following libraries: libc.so.6 libpthread.so.0
缺少類庫,然後其實我發現我的類庫在系統里是存在的:
locate libc.so.6
結果:
/lib/i386-linux-gnu/libc.so.6
/lib/i386-linux-gnu/ libpthread.so.0
/lib64/libc.so.6
但是我的應用程序用到了 Libpthread,所以提示 少了2個依賴庫。
