文章目录
- 下载交叉编译工具链
- 安装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】