RISCV交叉编译动态链接库总结

目录

前言

一、使用buildroot编译动态库及根文件系统

1. 介绍

2. 编译配置选项

二、编译动态库的source源码

1.使用cmake进行编译

2.使用configure进行编译

3.只有makefile的source代码

总结


前言

随着riscv的越来越普及,以及linux内核对riscv支持越来越完善,我们迫不及待的要在riscv内核的linux系统上运行所需要的应用程序,随着应用程序复杂性的提升,所需的库也越来越多,所以更一个衍生的问题就出现了,那就是交叉编译的静态库或者动态库问题,本文的主要目的就是介绍各种交叉编译的过程以及方法,让大家能够快速生成所需的动态库或者静态库。

一、使用buildroot编译动态库及根文件系统

1. 介绍

    Buildroot 是 基于Linux 平台上一个开源的嵌入式 Linux 系统自动构建系统。很多公司在发布自己的linux的bsp包时都会基于此系统,buildroot的编译系统是基于Kconfig 配置文件构成的,你可以和编译Linux内核一样,通过 make defaultconfig获取配置,make menuconfig 修改配置选项等,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(kernel、rootfs以及rootfs中的各种库和应用程序),而对于riscv系统来说,会编译出一整套的可运行程序,可以通过qemu来运行在虚拟机上进行仿真和测试,这是一个非常好用的构建工具。国内使用的缺点就是,好多库文件都是放在github上的,下载编译时可能会失败(timeout),所以出现这种错误时,可以多试几次。那么本文就以riscv为例编译一些动态链接库。

2. 编译配置选项

> 使用一下指令下载buildroot: git clone https://git.buildroot.net/buildroot

> 执行:make qemu_riscv64_virt_defconfig, 本实例采用qemud的virt config

> 执行:make menuconfig,进入如下图所示的界面,选择需要的lib包

 在Target packages->libraries可选择对应的库,当然并不是所有的库都支持riscv,可能会出现编译错误,这就需要后面我们在用其他的方法了。编译完成后会在output下面生成host和target两个文件夹,host用于交叉编译的引用部分,target文件夹可以作文根文件系统的lib库。在对应位置找到所需的动态库,分别copy到工具链用于交叉编译或者copy到根文件系统,作为运行时的链接库。

二、编译动态库的source源码

1.使用cmake进行编译

有些source code会使用cmake进行交叉编译,这个会比较简单,一般只需要如下一下指令即可

cmake ./ -LH   //用于查看当前cmake支持哪些配置指令,如是否使能动态库,关闭debug功能等,根据具体情况而定。
cmake .. -DCMAKE_CXX_FLAGS=-fPIC -DBUILD_SHARED_LIBS=ON -DCMAKE_C_COMPILER=riscv64-unknown-linux-gnu-gcc -DCMAKE_CXX_COMPILER=riscv64-unknown-linux-gnu-g++ -DCMAKE_INSTALL_PREFIX=${INSTALL_PATH}

如上图执行第二条指令后,是分别制定交叉编译的工具链,和prefix的安装路径等等。执行完毕后既可通过make指令进行编译了,一般如果无特殊的汇编代码外,基本上80%可以编译了,如果源码中有example或者unittest,可以进行测试,是否符合要求。

初次之外有些cmake会通过cmake文件指定交叉编译工具,如下:

set(CMAKE_SYSTEM_NAME Linux)

set(TOOLCHAIN_PATH ${CROSS_TOOL_PATH})
set(CMAKE_C_COMPILER ${TOOLCHAIN_PATH}/bin/riscv64-unknown-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/bin/riscv64-unknown-linux-gnu-g++)
set(CMAKE_LIBRARY_PATH ${TOOLCHAIN_PATH}/riscv64-unknown-linux-gnu/lib)

然后通过以下指令指定交叉工具文件的路径即可:

cmake -DCROSS_TOOL_PATH=${CROSS_COMPILE_TOOLCHAIN_PATH} ./

2.使用configure进行编译

另一些源码可能会使用configure的方式进行编译,可以执行./configure --help查看当前支持的配置选项,进行配置,一般可按如下方式进行配置:

./configure --host=riscv64-unknown-linux-gnu CC=riscv64-unknown-linux-gnu-gcc CXX=riscv64-unknown-linux-gnu-g++ --prefix=${INSTALL_PATH} --with-shared

其中--host配置较为重要,有些务必要使用交叉工具的前缀进行配置,否则的话可能无法找到LD配置,只会输出静态库,无法生成动态库,请务必注意。

3.只有makefile的source代码

这类代码一般会比较简单,只有简单的makefile,一般情况下只有一个文件会出现,所以makefile也比较容易看懂,一般情况下直接指定CC工具即可,可按如下方式进行配置:

export CC=riscv64-unknown-linux-gnu-gcc
make && make install

如果需要c++,可以再export出C++的工具链即可。


总结

如上所述的几种情况较为常用,适合一般的比较成熟的库,如果是一些不太常用的库,可能根本不支持交叉编译,所以可能需要自己去尝试支持了,如国内的许多自行研发的库,在交叉编译上做的还不是很好,一般建议先按照如上方式进行编译,出现问题可以自行解决,如果当前该库已经支持了arm的交叉编译,那么按照arm的方式修改即可,如有涉及汇编代码部分,可以仿照x86或者arm的平台进行移植,或者参考其他支持riscv的库。这个就不做详细介绍了,毕竟每个人遇到的问题都不太一样。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值