前言
因公司業(yè)務(wù)需要霸妹,需要做大量的C++代碼遷移到Android方面的工作瞻赶,這是一個(gè)費(fèi)時(shí)費(fèi)力的過程维雇,因?yàn)檫w移過程中會遇到各種各樣的問題赊舶,小到.h頭文件找不到睁搭,大到一個(gè)運(yùn)行不正常。
這是我在簡書上的第一篇文章笼平,就以遷移libusb到Android開發(fā)板為例园骆,整理出本人遇到的問題及解決方法,希望對有需要的朋友有所幫助:
使用環(huán)境
環(huán)境:Ubuntu 14.04 寓调,tiny4412(Android開發(fā)板)
工具:NDK锌唾,CatkinMake
編譯包:libusb1.0,libusb0.12
既然要編譯libusb夺英,就要了解它晌涕,目前為止,libusb庫大版本分為1.0.X, 0.XX,且兩個(gè)大版本庫中方法差別挺大痛悯。
libusb1.X與libusb0.X版本語法比較
libusb1.0.x主要語法余黎,太多了,截取了部分
圖1 libusb1.0XX版本部分語法截圖
libusb-0.XX版本
圖2 libusb0.XX版本部分語法截圖
查看.so庫中包含語法可在linux系統(tǒng)下通過 nm命令载萌,例:$ nm libusb.so
編譯libusb1.X惧财,libusb0.x
libusb1.X
源碼下載:https://github.com/libusb/libusb.git
上邊作者介紹有編譯方法,這里引用了也提及下扭仁,尊重原著垮衷,感謝開源奉獻(xiàn);
考慮到部分人可能未使用過ndk乖坠,這里也簡單介紹下編譯方法搀突,及如何編譯出動(dòng)態(tài)庫.so,靜態(tài)庫.a
注:大牛瓤帚,使用過的朋友可忽略這部分描姚,請輕噴涩赢。
編譯:進(jìn)入jni目錄下戈次,通過ndk-build命令編譯
庫:默認(rèn)編譯為動(dòng)態(tài)庫.so轩勘,如需編譯靜態(tài)庫,將libusb.mk最后一行
include $(BUILD_SHARED_LIBRARY)改為:include $(BUILD_STATIC_LIBRARY)
編譯運(yùn)行即可怯邪。
libusb0.X
下載libusb-0.1.12軟件包:http://sourceforge.net/projects/libusb/files/
解壓開绊寻,執(zhí)行
<pre>
./configure --host=arm-none-linux-gnueabi --prefix=/home/ubuntu/Downloads/install
make
make install
</pre>
注:host為使用的編譯鏈,prefix為編譯出的文件路徑
連接libusb庫
在CmakeLists通過link_libraries悬秉,target_link_libraries引入.so澄步、.a庫
通過include_directories引入.h頭文件
例:
.h頭文件
set(libusb_INCLUDE_DIRS "/opt/include/mylibusb")
include_directories(${libusb_INCLUDE_DIRS})
.so 、.a庫
set(libusb_LIBRARIES "/opt/lib/libusb-0.1.so")
target_link_libraries(xxx ${libusb_LIBRARIES})
link_libraries(${libusb_LIBRARIES})
遇到的問題:
<pre>
1.error: undefined reference to 'libusb_bulk_transfer'
原因:缺少或找不到libusb包和泌,編譯中存在使用該包的依賴村缸;
解決方法將libusb包編譯成arm的添加進(jìn)去
</pre>
<pre>
2.No rule to make target `/opt/lib/libusb-0.1.so'
原因:MakeFile文件中沒有對應(yīng)的關(guān)聯(lián)映射
解決方法:檢查是否路徑引用有問題,多數(shù)是語法(Cmake)問題武氓。
</pre>
<pre>
3.can't find -lusb
原因:找不到libusb.so包
解決方法:查看引用路徑時(shí)候有問題梯皿,確保libusb正確引用。
</pre>
總結(jié)
總體來說县恕,該篇定位為libusb遷移入門引導(dǎo)篇更為合適东羹,權(quán)且拋磚引玉,希望對大家有所幫助忠烛。