1 toolchainfile.cmake
交叉編譯libiio,需要使用到cmake。而根據參考資料[1]中有關交叉編譯的說明,cmake此時需要乙個toolchainfile.cmake檔案(改為其它名字也行),根據參考資料[2]的說明, 編輯toolchainfile.cmake的內容如下:
# this one is important
set(cmake_system_name linux)
#this one not so much
set(cmake_system_version 1)
# specify the cross compiler
set(cmake_c_compiler /home/liyihai/es/arago-2011.09/armv5te/bin/arm-arago-linux-gnueabi-gcc)
set(cmake_cxx_compiler /home/liyihai/es/arago-2011.09/armv5te/bin/arm-arago-linux-gnueabi-g++)
# where is the target environment
set(cmake_find_root_path /home/liyihai/rootfs_v2.0 /home/liyihai/es/arago-2011.09/armv5te)
# search for programs in the build host directories
set(cmake_find_root_path_mode_program never)
#set(cmake_find_root_path_mode_program only)
# for libraries and headers in the target directories
set(cmake_find_root_path_mode_library only)
set(cmake_find_root_path_mode_include only)
為了方便編譯,再建立乙個config.sh指令碼,內容如下:
#!/bin/bash
toolchain_path=/home/liyihai/es/arago-2011.09/armv5te
cmake -dcmake_toolchain_file=$/toolchainfile.cmake .
說明:toolchain_path是建立toolchainfile.cmake的目錄。
2 missing: libxml2_libraries libxml2_include_dir
執行config.sh指令碼即可配置libiio,然而事情當然沒有那麼順利,提示錯誤如下:
could not find libxml2 (missing: libxml2_libraries libxml2_include_dir)
其實,這個時候系統中已經有arm版的libxml2庫了(編譯方法見《
linux中交叉編譯libxml2》),於是覺得應該是沒有定義環境變數libxml2_libraries和libxml2_include_dir(但是實踐證明,並不是這個原因。其實,就算你定義了上述兩個環境變數也無濟於事)。
在第1章中,指定了cmake_find_root_path為/home/liyihai/rootfs_v2.0和/home/liyihai/es/arago-2011.09/armv5te兩個目錄,同時指定了cmake_find_root_path_mode_include的值為only,根據參考資料[2]的說明可知,這時cmake只會以上述兩個目錄為根目錄來搜尋標頭檔案。
2.1 libxml2_include_dir
經過檢視發現上述的兩個目錄中都沒有libxml標頭檔案,所以出現了missing:libxml2_include_dir的錯誤。
由於ubuntu系統中有libxml標頭檔案,於是試圖定義乙個環境變數libxml2_include_dir,並且其值設為ubuntu中libxml標頭檔案的目錄,結果問題依舊!因為ubuntu中的libxml頭檔案目錄不在cmake的搜尋路徑中,所以定義libxml2_include_dir也無濟於事。
解決這個問題的辦法有2種:a)將ubuntu的libxml標頭檔案路徑新增到cmake_find_root_path中;2)注釋掉下面的設定,使得cmake搜尋標頭檔案的路徑不受限制:
set(cmake_find_root_path_mode_include only)
2.2 libxml2_libraries
經過查詢發現/home/liyihai/rootfs_v2.0中是包含有libxml庫檔案的。經過測試發現,libxml庫的檔名(libxml2.so.2.8.0)有點問題。建立乙個libxml2.so到libxml2.so.2.8.0的軟連線,問題解決。在之後出現的pthread_libraries問題,用同樣的辦法解決。
3 libxml2.so.2, needed by ../libiio.so.0.5, not found (try using -rpath or -rpath-link)
在指定的目錄中已經包含了libxml2.so.2,但是這裡卻提示找不到!
3.1 解決方法1
將libxml2.so及其所鏈結的檔案複製到libxml2原始碼目錄中,然後再編譯,即可通過。
3.2 解決辦法2
在cmakecache.txt中找到cmake_exe_linker_flags變數,將其值設為:
cmake_exe_linker_flags:string= -l/home/liyihai/rootfs_v2.0/usr/lib -lxml2 -l /home/liyihai/rootfs_v2.0/lib -lz
上面指定了libxml2,libz兩個庫(libxml2依賴libz),並且指定其所在路徑。重新使用make命令進行編譯即可(make會自動呼叫cmake來解析cmakecache.txt)
4 交叉編譯libiio examples
需要修改原來的makefile,如下所示:
targets := ad9361-iiostream iio-monitor
cflags = -wall -i ../ -i /home/liyihai/rootfs_build/include
ldflags = -l ../ -l /home/liyihai/rootfs_v2.0/usr/lib -l /home/liyihai/rootfs_v2/lib -l /home/liyihai/rootfs_build/lib_old
cc=arm-arago-linux-gnueabi-gcc
.phony: all clean
all: $(targets)
iio-monitor.o: iio-monitor.c
# $(cc) -c -o $@ $^ $(cflags)
ad9361-iiostream.o : ad9361-iiostream.c
$(cc) -c -o $@ $^ $(cflags)
iio-monitor: iio-monitor.o
$(cc) -o $@ $^ $(ldflags) -lpthread -lncurses -lcdk -liio -lxml2 -lz
ad9361-iiostream : ad9361-iiostream.o
參考資料
[1]what is libiio?
[2]cmake cross compiling
[3]cmake的一些小經驗
linux 核心交叉編譯
我使用執行make menuconfig配置核心。使用之前,先執行make mrproper,該命令會刪除核心源 中的.config檔案和.o檔案保證源 的乾淨。在執行make menuconfig時,這裡面會涉及到幾個資料夾 linux核心根目錄下的scripts資料夾 arch arch kco...
Linux之交叉編譯
交叉編譯 在乙個平台上生成另乙個平台的可執行 編譯 是在乙個平台上生成該平台的可執行程式 為什麼要交叉編譯 有的平台上不允許或者不能夠安裝我們所需要的編譯器比如c51。因為目的平台上的資源匱乏,無法執行我們所需要的編譯器。樹莓派是不是就不需要交叉編譯?錯。也要,樹莓派有時又是因為目的平台還沒建立,連...
linux交叉編譯工程中,單獨編譯某個檔案的方法
有時候我們只修改了乙個檔案,想看一下有沒有編譯問題,但如果全工程的編譯的話又很慢,所以這個時候可以單獨編譯。例如下面時我編譯工程中的乙個節選 aarch64 poky linux g mcpu cortex a72.cortex a53 crypto mtune cortex a72.cortex ...