Ubuntu下交叉编译工业相机库aravis到OpenHarmony(aarch64)使用

发布于:2025-06-27 ⋅ 阅读:(20) ⋅ 点赞:(0)

自行编译的库都统一放到一个地方去,这样引用时方便一些,比如我源码放到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】


网站公告

今日签到

点亮在社区的每一天
去签到