文章目錄
- 下載交叉編譯工具鏈
- 安裝meson
- 編寫交叉編譯配置文件
- 編譯glib
- 編譯libiconv
- 編譯libxml2
- 編譯libusb(暫時不編譯,依賴的udev庫我找不到)
- 編譯Aravis
- 使用
自行編譯的庫都統一放到一個地方去,這樣引用時方便一些,比如我源碼放到OpenHarmony
這里,而編譯后install的東西放到OpenHarmony/install
這里
下載交叉編譯工具鏈
我的目標設備是aarch64架構的,所以我下載這個交叉編譯工具鏈
https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/
解壓后放在某個文件夾,并且將對應的路徑添加到當前用戶的.bashrc
中,添加完后,還得記得source一下生效。
設置完之后,就可以直接通過aarch64-linux-gnu-xxx
這樣的方式來使用交叉編譯工具了,方便。
安裝meson
pip install meson
編寫交叉編譯配置文件
創建一個cross_aarch.txt,內容如下,后面有用。注意里面使用到的路徑
#[constants]
#native_path = 'D:/harmonyOS/OpenHarmony/11/native'
#sysroot_path = 'D:/harmonyOS/OpenHarmony/11/native/sysroot'[host_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'[properties]
# 這個設置了也沒生效
prefix = '/home/yong/Desktop/OpenHarmony/install'
include_directories = ['/home/yong/Desktop/OpenHarmony/install/include']
link_directories = ['/home/yong/Desktop/OpenHarmony/install/lib']
# 指定 pkg-config 的查找路徑,貌似沒用
#pkg_config_libdir = ['/home/yong/Desktop/OpenHarmony/install/lib/pkgconfig']# 編譯glib時,這個組的內容都要注釋掉
[built-in options]
c_args = ['-I/home/yong/Desktop/OpenHarmony/install/include']
c_link_args = ['-L/home/yong/Desktop/OpenHarmony/install/lib']
cpp_args = ['-I/home/yong/Desktop/OpenHarmony/install/include']
cpp_link_args = ['-L/home/yong/Desktop/OpenHarmony/install/lib'][binaries]
c = 'aarch64-linux-gnu-gcc'
cpp = 'aarch64-linux-gnu-g++'
ar = 'aarch64-linux-gnu-ar'
ld = 'aarch64-linux-gnu-ld'
objcopy = 'aarch64-linux-gnu-objcopy'
strip = 'aarch64-linux-gnu-strip'
pkg-config = 'pkg-config'
我的這個文件是放在’/home/yong/Desktop/OpenHarmony’這個路徑下的,而其他需要編譯的源碼我也是解壓后放這個文件夾,這就意味著后面每個需要用meson來構建的的庫,在構建時都可以通過--cross-file ../cross_aarch64.txt
來使用這個文件,就不用每個項目配一個了。
編譯glib
下載glib
https://github.com/GNOME/glib/releases/tag/2.78.6
注意下載的glib不要太新,太新的話會報錯(但是也不能低于2.59.1,因為meson是從這個版本才引入):
..\glib-2.85.1\meson.build:1:0: ERROR: Meson version is 0.59.2 but project requires >= 1.4.0
從aravis的meson.build文件,可以看到,大于等于2.52即可
下載后解壓,并且將前面創建的文件拷貝到源碼目錄下
執行指令
--prefix
指的是編譯后的文件的安裝路徑,需要是絕對路徑
meson setup --prefix=/home/yong/Desktop/OpenHarmony/install \
--cross-file ../cross_aarch64.txt builddir \
-Dlibmount=disabled \
-Dselinux=disabled \
-Dtests=false \
-Dglib_debug=disabled \
-Dnls=disabled
在編譯的過程中,會自動下載庫;假如下載到一半的然后不下載的話,可能會報對應的子模塊中的meson.build不存在,這時需要將子模塊的文件夾刪除在運行上述一遍指令。
等上面指令執行完,再執行下面指令
ninja -C builddir/ninja -C builddir/ install
然后在指定的安裝位置就得到了編譯好的庫了
編譯libiconv
下載源碼
https://www.gnu.org/software/libiconv/#TOCdownloading
./configure --prefix=/home/yong/Desktop/OpenHarmony/install --host=aarch64-linux-gnu
make
make install
編譯libxml2
下載源碼
https://github.com/GNOME/libxml2/releases/tag/v2.12.9
libxml2是用cmake構建的
添加之前編譯的庫的安裝路徑進來
CMAKE_INCLUDE_PATH
CMAKE_LIBRARY_PATH
修改安裝路徑,取消LZMA
取消python
勾選Advanced
,將以下參數填進去CMAKE_EXE_LINKER_FLAGS
(具體路徑要以你存放的路徑為準)
-L/home/yong/Desktop/OpenHarmony/install/lib -lz -L/home/yong/Desktop/OpenHarmony/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib -lm
然后點擊 Configure
Generate
然后到build
文件夾
make
make install
編譯libusb(暫時不編譯,依賴的udev庫我找不到)
https://github.com/libusb/libusb/releases
因為用到sysroot中的libudev,因此需要指定一下搜索路徑
./autogen.sh
./configure
至此,Aravis所依賴的第三方庫(glib、libxml2、libiconv等)我們都已經下載源碼、編譯好后安裝到了指定的文件夾。
編譯Aravis
下載源碼
【Aravis: A vision library for genicam based cameras 】
解壓,然后cd 到源碼位置
執行指令
將我們前面安裝的庫的路徑告訴系統,不然pkg-config會去本機上面找,找出來的是不對的
export PKG_CONFIG_PATH="/home/yong/Desktop/OpenHarmony/install/lib/pkgconfig"
由于前面的libusb無法編譯,只能先禁用aravis對usb設備的支持,也就是編譯出來的庫只能支持Gige相機
meson setup builddir -Dviewer=disabled -Dgst-plugin=disabled -Ddocumentation=disabled -Dusb=disabled -Dintrospection=disabled --cross-file ../cross_aarch64.txt --prefix='/home/yong/Desktop/OpenHarmony/install'
然后編譯、安裝
ninja -C builddir
ninja -C builddir install
使用
將整個install文件夾拷貝到Windows平臺上,然后再DevEco Studio中使用即可。
在項目的CMakeLists.txt中增加以下代碼
# aravis
set(ARAVIS_ROOT "D:/harmonyOS/aravis")
target_include_directories(entry PRIVATE "${ARAVIS_ROOT}/include")
target_include_directories(entry PRIVATE "${ARAVIS_ROOT}/include/aravis-0.8")
target_include_directories(entry PRIVATE "${ARAVIS_ROOT}/include/glib-2.0")
target_include_directories(entry PRIVATE "${ARAVIS_ROOT}/lib/glib-2.0/include")
target_link_directories(entry PRIVATE "${ARAVIS_ROOT}/lib")
target_link_libraries(entry PRIVATE aravis-0.8 xml2)
編譯時會報錯,說libaravis-0.8.so有問題啥的。
這是因為libaravis-0.8.so是個在linux下的軟鏈接,在windows下可能會有問題。因此要先備份好原有的庫(我這里直接在最后加了個橫杠),然后拷貝libaravis-0.8.so.0.8.33
,然后將其改為 libaravis-0.8.so
然后拷貝以下庫到arm64-v8a
下面,拷貝的時候不能直接拷貝對應名字的,而是要拷貝同樣名字前綴但是體積最大的那個,拷貝到arm64-v8a
中,再更改名字。不然你拷貝的是軟鏈接,沒用。
編譯然后運行,報這個錯誤。
在Ubuntu上用readelf 看看
readelf -d libaravis-0.8.so.0.8.33
可以使用patchelf
直接從文件上去掉
patchelf --replace-needed "/home/yong/Desktop/OpenHarmony/install/lib/libxml2.so" "libxml2.so" libaravis-0.8.so.0.8.33
把該放過來的文件都搞過來了,但是程序還是崩了,不知道為啥。
報這個錯誤
relocating failed: symbol not found. dso=/data/storage/el1/bundle/libs/arm64/libglib-2.0.so.0 s=strtoll_l use_vna_hash=1 van_hash=6969197
參考
【交叉編譯工具 aarch64-linux-gnu-gcc 的介紹與安裝】
【meson 創建交叉編譯】
【meson交叉編譯glib2.76】
【linux交叉編譯libiconv】
【cmake 頭文件 庫文件 路徑搜索 CMAKE_INCLUDE_PATH CMAKE_LIBRARY_PATH】
【在幽蘭上編譯libusb】