完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如果对交叉编译(cross compile)这个概念不太清楚的话,可以参考以下的一个说法。交叉编译通常指的是在PC机上使用交叉编译工具链(通常是编译内核的那个工具链),完成软件的编译,编译出一个可执行程序,此程序是基于对应CPU的架构上才能运行。这种情况叫做交叉编译。 对于龙芯嵌入式系列板卡,则采用以下方式进行交叉编译:在X86机器的ubuntu18.04的系统中,使用交叉编译工具链,编译软件,然后复制编译出来的可执行文件到板卡中(USB传输等手段),然后才能在板卡上运行。 需要注意的是,交叉编译出来的软件,不仅仅可以给busybox用,loongnix系统也能用。因为编译出来的可执行程序是适应对应架构的。 下文将会介绍软件的交叉编译方式,其中包括一般软件和Qt软件。 一般软件,本处的定义通常指代为没有使用特殊IDE进行编译的软件。下面将会介绍, 手动编译 , 使用makefile编译 , 使用Cmake编译 , 对于autotools-package方式的源码编译(有configure文件那种) 。 由于此章节适用于多数嵌入式板卡,但是编译和cpu的架构相关,所以会有所差别,下文中的编译演示将会以loongarch来说明 不同的架构,只是采用的交叉编译工具链不同,然后导致声明交叉编译工具链的命令不同。(下面的演示不包含工具链的部署) 下面的演示中,声明交叉编译工具链的命令是3条export语句。 例如:对于loongarch64(即64位loongarch架构)目前用的交叉编译工具链是toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18.tar.gz 命令如下: export PATH=$PATH:/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18/bin/export ARCH=loongarch64export CROSS_COMPILE=loongarch64-linux-gnu- 对于mips64el(即64位mips架构),目前mips64el用的交叉编译工具链是mips64el-linux-gcc-8.x.tar.gz 命令如下: export PATH=$PATH:/opt/mips64el-linux-gcc-8.x/host/binexport ARCH=mipsexport CROSS_COMPILE=mips64el-linux- 工具链可根据实际情况而定,声明工具链的PATH那个命令,路径是去到工具链里面的bin目录即可。 1. 手动编译软件以一段简单的代码用以说明,代码如下: 然后声明工具链,即在shell终端输入以下命令:(这个只是例子,按实际情况而定) export PATH=$PATH:/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18/bin/export ARCH=loongarch64export CROSS_COMPILE=loongarch64-linux-gnu- 随后输入以下命令进行编译:(这个只是例子,按实际情况而定)。 loongarch64-linux-gnu-gcc main.c -o main 通过file命令查看编译后的main 文件,显示“unknown arch 0x102”,这是因为LoongArch的二进制编号为258(0x102),较新的file 命令才添加了对LoongArch的支持。 然后就可以复制main这个可执行程序到板卡(USB传输等方式,视情况而定),然后就能运行这个程序。 2. 使用Makefile编译软件本处不再赘述Makefile的相关概念。 下面将会使用龙芯测试软件的一个例子来说明。 上图是软件的代码结构展示图。main.c调用uart_test模块,uart_test调用uart模块。 下面将会提供一个Makefile文件的例子:
请注意,由于makefile对缩进的格式很严谨,上述的内容只是作为例子,如果直接使用,还需 根据实际情况,手动调整格式 。见下图,需要使用tab进行缩进。 在makefile文件所在的文件夹打开终端。 然后声明工具链,即在shell终端输入以下命令:(这个只是例子,按实际情况而定) export PATH=$PATH:/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18/bin/export ARCH=loongarch64export CROSS_COMPILE=loongarch64-linux-gnu- 需要注意的是,如果直接make,按照Makfile文件里面的CC=gcc,那么生成的程序就是编译的机器上能运行的,见下图: 可以修改CC的值为对应交叉编译工具链gcc的名字。 源码可以在有编译条件下的系统上可以编译,比如loongnix上面有gcc,那么就能编译。 交叉编译的时候,建议make命令为: make CC=loongarch64-linux-gnu-gcc 同样地,复制可执行程序到板卡上运行即可。 3. 使用Cmake编译关于CMake的构建不再赘述。本处只说明cmake命令运行时如何指定交叉编译工具链。 下面将会以龙芯测试软件的cmake构建来作为例子说明。 声明工具链,即在shell终端输入以下命令:(这个只是例子,按实际情况而定) export PATH=$PATH:/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18/bin/export ARCH=loongarch64export CROSS_COMPILE=loongarch64-linux-gnu- 预期的构建方式是CMakeLists.txt文件在源码根目录,需要创建一个build文件夹,然后在build文件夹中使用命令: cmake ../ 即可完成Cmake部署,然后make进行构建。 注意上述只是一个例子,构建过程需要按照实际情况调整。 如同上述的Makefile那样,没有指定对应的gcc,那么是以编译的机器的架构来编译的。 如果cmake的时候不小心没指定gcc,那么建议清空相关文件(按照本例子,则删除build文件夹),重新操作。 那么如果要指定gcc和g++,可以参考下面的命令: cmake -DCMAKE_C_COMPILER=loongarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=loongarch64-linux-gnu-g++ ../ 随后make的话就是用指定的gcc编译。 当然上述的指定gcc的方式只是其中一种,更多的方式可以根据Cmake的特性进行修改(比如修改CMakeLists.txt文件)。 4. 使用autotools-package编译(./configure)对于使用configure文件来检查编译环境的源码,如果是本地编译,那么只需要./configure,make, make install即可。但是在交叉编译的时候,是需要指定交叉编译工具链的。 下面将以编译coreutils-8.32为例子说明。 输入./configiure --help的时候会发现CC这个属性,这个就是gcc的值。理论上只要声明工具链,然后执行configure时指定参数CC=loongarch64-linux-gnu-gcc的话,就能指定工具链。 但是会发现报以下的错误: 所以建议的操作如下: 声明工具链,即在shell终端输入以下命令:(这个只是例子,按实际情况而定) export PATH=$PATH:/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18/bin/export ARCH=loongarch64export CROSS_COMPILE=loongarch64-linux-gnu- 输入命令:
而对于loongarch架构,因为这是新的架构,目前ubuntu18.04里面是没有这个架构的记录的。进而报这个错误。 这是在build-aux/config.sub脚本里面没有loongarch64的记录。而在系统的/usr/share/misc文件夹下面,有以下的文件。 那么建议切换到root用户下(su root),在/usr/share/misc的文件夹下对config.guess和config.sub文件进行添加(建议事先备份)或者下载最新的config.guess和config.sub 文件。下载方法: 下载config.sub sudo wget -O /usr/share/misc/config.sub "git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD" 下载config.guess sudo wget -O /usr/share/misc/config.guess "git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD" 如手动修改config.guess或config.sub则添加内容如下: config.guess文件的964行附近,添加
如下图: 在config.sub文件的295行附近,添加:
如下图: 可见添加内容都是仿照其他架构的内容。添加的位置不是指定的。只需要模仿得当即可。 然后在build-aux里面执行以下命令( 注意不是root用户 ): cp /usr/share/misc/config.guess /usr/share/misc/config.sub ./ 然后configure就能成功执行。 随后只需要make即可编译完成。 注意交叉编译的产物不是编译机能用的程序,所以make install的话,就会把不属于编译机的程序安装到编译机的/usr中。那么将会是比较麻烦的事情。 所以请提前准备好安装的目录,并且在configure的参数中声明或者 make install的时候指定安装路径 。通常--prefix指的是安装路径。建议在configure的时候指定好。 其他更加精细的安装目录设置则根据实际情况与configure的特性而自行指定。 对于其他源码包,可能关于config.guess的报错不只一处,还请按照实际情况做出对应操作。 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
1340 浏览 0 评论
629 浏览 0 评论
1434 浏览 0 评论
【龙芯2K0300蜂鸟板试用】(求助)龙芯2K0300蜂鸟板如何驱动摄像头?
1274 浏览 1 评论
918 浏览 0 评论
3231浏览 67评论
1790浏览 12评论
1151浏览 9评论
7682浏览 9评论
【龙芯2K0300蜂鸟板试用】适配opencv-mobile
3265浏览 6评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 13:56 , Processed in 0.501389 second(s), Total 40, Slave 31 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号