交叉编译开源代码(以libgpiod为例)

2023-11-30 20:10

本文主要是介绍交叉编译开源代码(以libgpiod为例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.为什么要交叉编译
  • 2.交叉编译源代码
    • 2.1首先下载libgpiod,并解压缩:
    • 2.2修改配置文件
      • 2.2.1方法一:用文本编辑器打开Makefile,将所有涉及到编译的编译器改为交叉编译器,例如将gcc改为arm-linux-gnueabihf-gcc,注意必须修改每一处含有编译器的代码,否则可能移植后无法运行。
      • 2.2.2方法二:通过configure文件修改
  • 3.总结

1.为什么要交叉编译

  我们主力机的CPU一般架构为X86(Intel,Amd.etc),然而开发板的cpu大都为arm架构的,X86架构编译生成的二进制文件不能在arm架构上运行。因此我们需要在本机(例如linux虚拟机等)上使用交叉编译器编译源码,再把源码移植到开发板。
  安装交叉编译器:

sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf

2.交叉编译源代码

  以libgpiod为例:

2.1首先下载libgpiod,并解压缩:

https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/refs/?h=v1.6.x
可以看到文件夹内有:
2.1

2.2修改配置文件

运行autogen.sh,将生成configure和Makefile文件,主要关注这两个文件:
2.2

2.2.1方法一:用文本编辑器打开Makefile,将所有涉及到编译的编译器改为交叉编译器,例如将gcc改为arm-linux-gnueabihf-gcc,注意必须修改每一处含有编译器的代码,否则可能移植后无法运行。

2.3
除了修改编译器,还需要修改生成编译后文件的路径。因为我们要将文件移植到开发板,所以我们不需要将生成的文件保存到本机系统目录下,所以我们要把prefix字段下的路径改为自定义的:

prefix = 你想保存的文件夹

然后使用编译安装:

make
make install

2.2.2方法二:通过configure文件修改

通过文本编译器打开configure文件,查看文件内容与参数。总结后可以使用命令来安装:

 ./configure CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ RANLIB=arm-linux-gnueabihf-ranlib AR=arm-linux-gnueabihf-ar AS=arm-linux-gnueabihf-as NM=arm-linux-gnueabihf-nm STRIP=arm-linux-gnueabihf-strip OBJDUMP=arm-linux-gnueabihf-objdump --prefix=`pwd`/../install --enable-tools --host=arm-linux

执行后可以发现我们的Makefile文件被更新了,打开看看发现涉及到交叉编译器的地方已被修改,生成的路径也被修改了:
2.4
2.5
然后使用编译安装:

make
make install

如果出现报错:undefined reference to rpl_malloc
则去配置文件configure把含有此行的代码删除

3.总结

  编译完后将生成的文件夹打包移植到开发板,建议放在/opt/crosstool下,并为其添加环境变量。以libgpiod源码的交叉编译为例,其他库的方法大致相同。

这篇关于交叉编译开源代码(以libgpiod为例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438376

相关文章

Java编译错误java.lang.NoSuchFieldError的解决方案详析

《Java编译错误java.lang.NoSuchFieldError的解决方案详析》java.lang.NoSuchFieldError是Java中的一种运行时错误,:本文主要介绍Java编译错... 目录前言解决方案1. 统一JDK版本环境2. 优化maven-compiler-plugin配置3. 清

GO语言中gox交叉编译的实现

《GO语言中gox交叉编译的实现》本文主要介绍了GO语言中gox交叉编译的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、安装二、使用三、遇到的问题1、开启CGO2、修改环境变量最近在工作中使用GO语言进行编码开发,因

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、