Linux中交叉編譯libiio

2021-06-29 13:37:06 字數 3930 閱讀 9294

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 ...