1. 程式人生 > >Libusb交叉編譯和移植

Libusb交叉編譯和移植

  Libusb交叉編譯和移植
  
  某專案核心需要支援USB的相關操作,所以考慮移植Libusb庫
  
  1、到官網下載最新的libusb原始碼(1.0.22)
  
  2、解壓原始碼
  
  3、進入解壓後的資料夾進行交叉編譯
  
  5、將動態庫複製到當前系統的/lib下
  
  6、libusb-compat的安裝
  
  7、將libusb移植到單板
  
  8、製作測試程式的Makefile檔案
  
  9、編譯過程遇到的問題
  
  某專案核心需要支援USB的相關操作,所以考慮移植Libusb庫
  
  1、到官網下載最新的libusb原始碼(1.0.22)
  
  https://sourceforge.net/projects/libusb/files/
  
  -rwxr–r-- 1 roth-qt roth-qt 598833 7月 10 08:47 libusb-1.0.22.tar.bz2
  
  2、解壓原始碼
  
  tar -xvf libusb-1.0.22.tar.bz2
  
  3、進入解壓後的資料夾進行交叉編譯
  
  ./configure --build=i686-linux --host=arm-linux --prefix=/home/roth-qt/libusb_source/libusb CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ --disable-udev
  
  1
  
  –host=arm-linux表示該軟體編譯完成後在arm平臺上執行
  
  –prefix=/home/roth-qt/libusb_source/libusb 表示該軟體編譯完成後安裝目錄。
  
  此處我嘗試在/目錄下的子目錄安裝,發現會有找不到arm-linux-ranlib錯誤,而且指定環境變數也無法解決,只有在使用者目錄下進行安裝。
  
  另外配置時會出現configure: error: udev support requested but libudev header not installed,只需要disable掉udev就可以了。
  
  CC=,CXX等於指定了交叉編譯器
  
  4、編譯安裝
  
  make&&make install
  
  這一步執行完畢後交叉編譯完成
  
  但是編譯完成後發現libusb-1.0連線到libusb-1.0.so.0.1.0,而這個庫是沒有usb_init, usb_find_busses…所以要安裝libusb-compat-0.1.5
  
  5、將動態庫複製到當前系統的/lib下
  
  為了能夠在當前環境下編譯usblib的原始碼,將lib下的庫拷貝到/lib/下去
  
  sudo cp *.so /lib/. –d
  
  6、libusb-compat的安裝
  
  編譯出的include裡面沒有以前寫的應用程式需要的usb.h檔案!!! 需要在編譯1.0版本後,額外編譯0.1 compat相容支援包,它會產生usb.h!!
  
  配置libusb-compat-0.1.5的時候遇到了下面的錯誤
  
  checking for LIBUSB_1_0... no
  
  configure: error: Package requirements (libusb-1.0 >= 0.9.1) were not met:
  
  No package 'libusb-1.0' found
  
  1
  
  2
  
  3
  
  compat找不到依賴的libusb-1.0.x的configure出錯。在libusb_source/libusb/lib/pkgconfig目錄下找到了libusb-1.0.pc。所以在環境變數中新增
  
  export PKG_CONFIG_PATH=/home/roth-qt/libusb_source/libusb/lib/pkgconfig
  
  執行配置
  
  ./configure --build=i686-linux --host=arm-linux --prefix=/home/roth-qt/libusb_source/libusb CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ PKG_CONFIG_PATH=/home/roth-qt/libusb_source/libusb/lib/pkgconfig
  
  1
  
  之後make & make install完成安裝,之後在安裝目錄下的include找到了usb.h
  
  將usb.h移到libusb-1.0目錄下去
  
  檢視現在的lib目錄
  
  多了libusb.so連線到libusb-0.1.so.4.4.4,而這個庫是支援了usb_init, usb_find_busses…
  
  7、將libusb移植到單板
  
  tar jcvf libusb.tar.bz libusb
  
  將打包好的檔案放到fs的usr/local下
  
  在etc/profile或者(qt_env指令碼)中加入
  
  export LIBUSBDIR=/usr/local/libusb
  
  export LD_LIBRARY_PATH=/usr/local/libusb/lib:$LD_LIBRARY_PATH
  
  8、製作測試程式的Makefile檔案
  
  Makefile指定編譯行
  
  LIBUSB=/home/roth-qt/libusb_source/libusb
  
  arm-none-linux-gnueabi-gcc -o test -I${LIBUSB}/include/libusb-1.0 -L${LIBUSB}/lib/ -lusb -lusb-1.0 test.c
  
  1
  
  2
  
  9、編譯過程遇到的問題
  
  9.1、編譯連線的時候提示如下資訊
  
  UsbAudio.cpp:(.text+0x10): undefined reference to `usb_init'
  
  UsbAudio.cpp:(.text+0x14): www.mingcheng178.com undefined reference to `usb_find_busses'
  
  UsbAudio.cpp:(.text+0x18): undefined reference to `usb_find_devices'
  
  /tmp/ccskaM8m.o: In function `UsbAudio::usbFind()':
  
  UsbAudio.cpp:(.text+0x7c): undefined reference to `usb_get_busses'
  
  /tmp/ccskaM8m.o: In function `main':
  
  UsbAudio.cpp:(.text+0x39c): www.gcyL157.com undefined reference to `UsbAudio::UsbAudio()'
  
  UsbAudio.cpp:(.text+0x458): undefined reference to `UsbAudio::~UsbAudio()'
  
  UsbAudio.cpp:(.text+0x474):www.michenggw.com  undefined reference to `UsbAudio::~UsbAudio()'
  
  UsbAudio.cpp:(.text+0x478): undefined reference to `__cxa_end_cleanup'
  
  /tmp/ccskaM8m.o:(.ARM.extab+0x24): undefined reference to `__gxx_personality_v0'
  
  /home/roth-qt/libusb_source/libusb/lib//libusb-1.0.so: undefined reference to `clock_gettime'
  
  安裝了libusb-compat-0.1.5後在Makefile中加上-lusb編譯選項,會自動找到libusb.so的庫,此時它連線到libusb-0.1.so.4.4.4,支援上面的函式
  
  9.2、此時編譯還有三個錯誤
  
  UsbAudio.cpp:(.text+0x4b8): www.dasheng178.com/  undefined reference to `__cxa_end_cleanup'
  
  /tmp/ccMjiKNX.o:(.ARM.extab+0x24): undefined reference to `__gxx_personality_v0'
  
  /home/roth-qt/libusb_source/libusb/lib/ www.mcyllpt.com libusb-1.0.so: undefined reference to `clock_gettime'
  
  9.2.1 先解決第三個缺少clock_gettime的問題,只需要在Makefile編譯的時候加上連線選項-lrt就可以了
  
  9.2.2 前兩個問題是用g++編譯C++程式,在進行連線的時候需要標準c++庫,所以新增-lstdc++
  
  9.3、U盤的判斷
  
  找到USB裝置後,判斷bInterfaceClass是否為8,代表U盤