Linux 交叉编译工具链格式 sqlite3编译示例

1、交叉编译工具链

1.1 定义

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发工具集,它允许开发者在一个平台上(例如高性能的PC或服务器)编译生成另一个平台(例如嵌入式系统或不同的操作系统和硬件架构)上运行的代码。在Linux系统中,交叉编译工具链主要用于嵌入式系统的开发,因为嵌入式系统通常资源有限,难以直接在其上进行编译操作。

1.2 格式

通常其格式定义如下:

arch[-vendor][-os][-(gnu)eabi][-gcc]
  • arch:目标平台的体系架构,如armx86等。
  • vendor:工具链的供应商或自定义标识符,如果没有特定供应商,通常用none代替。
  • os:目标操作系统,如linuxandroid等。如果没有特定操作系统支持,也用none代替。
  • (gnu)eabi:嵌入式应用二进制接口(Embedded Application Binary Interface),它指定了文件格式、数据类型、寄存器使用、堆栈组织优化和在一个嵌入式软件中的参数的标准约定。例如,gnueabihf适用于ARM架构的硬浮点ABI。
  • gcc:表示这是一个GCC(GNU Compiler Collection)系列的编译器

1.3 工具示例

  • arm-linux-gnueabihf-gcc
    • 架构:ARM
    • 操作系统:Linux
    • ABI:GNU EABI with Hard Float (hf)
    • 描述:用于在Linux下为ARM架构编译带有硬浮点支持的程序。
  • arm-none-linux-gnueabi-gcc
    • 架构:ARM
    • 供应商:none(表示没有特定的供应商或定制)
    • 操作系统:Linux
    • ABI:GNU EABI
    • 描述:用于在Linux下为ARM架构编译没有特定供应商标识的程序,使用标准的GNU EABI。
  • aarch64-linux-gnu-gcc
    • 架构:ARM64(也称为AArch64)
    • 操作系统:Linux
    • ABI:GNU
    • 描述:用于在Linux下为ARM64架构编译程序。
  • mips-linux-gnu-gcc
    • 架构:MIPS
    • 操作系统:Linux
    • ABI:GNU
    • 描述:用于在Linux下为MIPS架构编译程序。

关于gnugnueabi 和 gnueabihf :

  • gnugnueabi 和 gnueabihf 这些后缀在工具链命名中用于描述对EABI的不同支持级别。
  • gnu 通常是一个更通用的标识,而 gnueabi 表明对EABI的支持,但不直接指明浮点运算的形式。
  • gnueabihf 则明确表示支持硬件浮点运算。
  • 对于只包含 gnu 或 gnueabi 的工具链命名,需要通过查阅文档或参考编译器选项来确定对浮点运算的具体支持情况。

2、linux下软件的交叉编译

2.1 configure作用

configure脚本将根据当前主机系统的类型和特性来检测系统环境,包括编译器、链接器、标准库、头文件等信息,然后生成一个包含编译选项和其他配置信息的Makefile文件。这个Makefile文件将根据检测到的环境配置编译过程,确保软件能够正确编译并在目标平台上运行。

在交叉编译情况下,configure脚本还会根据用户指定的交叉编译工具链来设置正确的编译器、链接器等工具,以确保生成的可执行文件能够在目标平台上正确运行。

2.2 configure常用选项

  • --build=BUILD
    • 指定编译所用的机器的平台。通常,如果不特别指定,其默认值将等同于 --host 选项的值。
  • --host=HOST
    • 指定编译出的代码将要运行的目标平台。这是交叉编译中最重要的选项之一。HOST 通常使用目标三元组(target triple)表示,包含 CPU 架构、供应商、操作系统和 ABI。例如,x86_64-unknown-linux-gnu 表示一个 CPU 架构为 x86_64、操作系统为 Linux、ABI 为 GNU 的系统。
  • --target=TARGET
    • 指定编译出来的工具链(如编译器、链接器等)生成的代码将要运行的目标平台。这个选项在构建交叉编译环境时较为常用,尤其是在编译 gcc、ld 等工具链时。通常情况下,正常编译和交叉编译都不会用到这个选项。
  • --prefix=PREFIX
    • 指定软件安装的位置。这在交叉编译时尤为重要,因为它决定了编译出的软件将安装到哪个目录。
  • --disable-FEATURE
    • 禁用某些特性。一些软件包提供了可选的编译时配置,如使用 Kerberos 认证系统或实验性的编译器优化。如果默认是提供这些特性,可以使用此选项来禁用它们。
  • --enable-FEATURE[=ARG]
    • 启用某些默认被禁止的特性,并可以为特性指定可选的参数。例如,启用特定的缓冲区大小或特定功能的启用/禁用。
  • --srcdir=DIR
    • 告诉 configure 源码的位置。通常不需要特别指定,因为 configure 脚本通常和源码文件在同一个目录下。
  • --program-prefix=PREFIX 和 --program-suffix=SUFFIX
    • 分别指定将被加到所安装程序的名字上的前缀和后缀。这有助于区分同一台机器上安装的不同版本或不同构建的程序。
  • --program-transform-name=PROGRAM
    • 使用 sed 脚本来变换安装的程序名。
  • LDFLAGS="-L/path/to/libs" 和 CPPFLAGS="-I/path/to/includes"
    • 分别用于指定链接器和预处理器使用的额外库和头文件路径。这在交叉编译时尤其有用,因为需要指定目标平台的库和头文件路径。

3、交叉编译sqlite3

3.1 获取源码

从官网获取:SQLite Download Page,直接下载放入虚拟机即可,也可以在资源处点击右键获取下载链接然后通过wget命令下载:

wget https://www.sqlite.org/2024/sqlite-autoconf-3460000.tar.gz

下载完成:

使用tar -xzf sqlite-autoconf-3460000.tar.gz解压:

3.2 配置

进入解压后的目录,创建一个output文件夹,进行如下配置:

./configure --host=aarch64-linux-gnu --prefix=/home/aka_li/linux/mysqlite3/sqlite-autoconf-3460000/output

其中aarch64-linux-gnu要修改为你的目标主机,/home/aka_li/linux/mysqlite3/sqlite-autoconf-3460000/output为你要输出的目录。

然后顺序执行make和make install,最终编译文件输出到前面指定的output文件夹中:

3.3 编程

参考之前文章中的数据库编程代码:Linux应用 sqlite3编程编译可执行程序,其中-L指定动态库位置,-I(大写i)指定头文件目录,-l(小写L)指定动态库名称:

aarch64-linux-gnu-gcc sqlite3.c -L/home/aka_li/linux/mysqlite3/sqlite-autoconf-3460000/output/lib/ -I/home/aka_li/linux/mysqlite3/sqlite-autoconf-3460000/output/include/ -lsqlite3 -o sqlitetest

进入output文件夹打包,命令如下:

tar -czvf sqlitefile.tar.gz .

打包完拷贝至目标板中,解压后将lib目录下的库拷贝到目标板的/lib目录下,将编译完成的应用程序也拷贝至目标板中,:

执行可执行程序,可以正常运行:

4、总结

本文讲解了linux下交叉编译工具链的格式,阐述了交叉编译软件时configure的配置过程,编写了sqlite3的交叉编译示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/759950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring boot初始化的几个总结

spring intializr File->New->Project 注意:Spring Initializer中 Java版本选择模块已经不支持1.8了。 Spring Boot 3.x要求 Java最低版本为17, 最新的SpringBoot版本已经要求Java22了 所以,你可以升级Java版本,使用Spri…

自定义指令directive

一、在src目录下创建一个directive文件夹 test.ts文件存放创建的自定义指令,index.ts用于接收所有指令进行统一处理 二、编写自定义指令 // test.ts文件 export default {// 写个自定义指令mounted(el: any, binding: any) {console.log(el, binding, "&qu…

JVM相关总结

JVM的些许问题 1.JVM内存区域划分 2.JVM类加载过程 3.JVM的垃圾回收机制 1.JVM的内存区域划分 一个运行起来的Java进程就是一个JVM虚拟机,需要从操作系统申请一大片内存,就会把内存划分成几个区域,每个区域都有不同的作用 常见的面试题 2.JVM类加载过程 熟练背诵 ! ! !…

Winform使用Flurl调用WebApi的基本用法

微信公众号“CSharp编程大全"的文章《.NET超简单轻量级的HTTP请求组件Flurl》介绍了便捷构建URL及创建HTTP请求的.NET模块Flurl。与HttpClient相比,Flurl封装的更简捷易用,代码量更少。本文学习并测试基于Fluri调用WebApi的基本用法。   基于Fluri调用WebApi…

怎么找python的运行路径

1.命令行中执行: import sys print(sys.argv[0]) 执行后为空。 2. import os os.path.abspath(os.curdir) 3. import os os.getcwd()

LeetCode-213. 打家劫舍 II【数组 动态规划】

LeetCode-213. 打家劫舍 II【数组 动态规划】 题目描述:解题思路一:分三种情况,一:不考虑头尾;二:考虑头不考虑尾;三:考虑尾不考虑头。解题思路二:优化空间解题思路三&am…

如何利用python画出AHP-SWOT的战略四边形(四象限图)

在企业或产业发展的相关论文分析中,常用到AHP-SWOT法进行定量分析,形成判断矩阵后,如何构造整洁的战略四边形是分析的最后一个环节,本文现将相关代码发布如下: import mpl_toolkits.axisartist as axisartist import …

java之命令执行审计思路

1 漏洞原理 因用户输入未过滤或净化不完全,导致Web应用程序接收用户输入,拼接到要执行的系统命令中执行。一旦攻击者可以在目标服务器中执行任意系统命令,就意味着服务器已被非法控制。 2 审计中常用函数 一旦攻击者可以在目标服务器中执行…

【AIGC】AnimateAnyone:AI赋予静态照片生命力的魔法

摘要: 在人工智能技术的不断进步中,AnimateAnyone项目以其创新性和易用性脱颖而出,成为GitHub上备受瞩目的AI项目之一。由阿里巴巴智能计算研究院开发的这一技术,允许用户通过提供一张静态照片,快速生成动态角色。本文…

SpringBoot(一)创建一个简单的SpringBoot工程

Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot(一)创建一个简单的SpringBoot工程 SpringBoot(二)SpringBoot多环境配置 SpringBoot(三)SpringBoot整合MyBatis SpringBoot(四…

docker安装rocketMq5x以上的版本

1.背景 安装RocketMQ 5.x以上的版本主要是因为新版本引入了许多性能优化、新功能以及对已有特性的增强,这些改进可以帮助提升消息队列系统的稳定性和效率。 1.性能提升:RocketMQ 5.x版本通常包括了对消息处理速度、吞吐量和延迟的优化,使得系…

在Linux (Ubuntu 16) 下安装LabVIEW

用户尝试在Ubuntu 16操作系统上安装LabVIEW,但找不到合适的安装文件来支持Ubuntu。已经下载了运行时文件,并尝试将.rpm包转换为.deb包并安装在Ubuntu上。然而,安装完成后,没有在应用程序中看到LabVIEW的图标。 用户希望能够在Ubu…

Spring MVC中的DispatcherServlet、HandlerMapping和ViewResolver的作用

在Spring MVC框架中,DispatcherServlet、HandlerMapping和ViewResolver是核心组件,它们各自承担着不同的角色和任务: 1.DispatcherServlet:它是Spring MVC生命周期中的前端控制器,负责接收HTTP请求并将它们分发给相应的…

【OpenREALM学习笔记:13】pose_estimation.cpp和pose_estimation.h

UML Class Diagram 图中红色框为头文件中所涉及到的函数、变量和结构体 核心函数 PoseEstimation::process() 其核心作用为执行位姿估计的处理流程,并返回是否在此循环中进行了任何处理。 在这个函数中判断并完成地理坐标的初始化或这地理坐标的更新。 这里需要…

论文阅读_基本于文本嵌入的信息提取

英文名:Embedding-based Retrieval with LLM for Effective Agriculture Information Extracting from Unstructured Data 中文名:基于嵌入的检索,LLM 从非结构化数据中提取有效的农业信息 地址: https://arxiv.org/abs/2308.03107 时间&…

昇思25天学习打卡营第04天|数据集 Dataset

数据是深度学习的基础,高质量的数据输入将在整个深度神经网络中起到积极作用。MindSpore提供基于Pipeline的数据引擎,通过数据集(Dataset)和数据变换(Transforms)实现高效的数据预处理。其中Dataset是Pipel…

【linux】网络基础(1)

文章目录 网络基本概念网络的定义网络的类型局域网(LAN)广域网(WAN) 网络协议OSI七层模型TCP/IP模型TCP/IP模型的结构 网络传输的基本流程计算机与计算机之间的通信计算机的信息处理封装报头 网络基本概念 网络的定义 1.网络是指…

1.搭建篇——帝可得后台管理系统

目录 前言项目搭建一、搭建后端项目1.初始化项目Maven构建 2.MySQL相关导入sql配置信息 3. Redis相关启动配置信息 4.项目运行 二、 搭建前端项目1.初始化项目2.安装依赖3.项目运行 三、问题 前言 提示:本篇讲解 帝可得后台管理系统 项目搭建 项目搭建 一、搭建后…

【2024-热-办公软件】ONLYOFFICE8.1版本桌面编辑器测评

在今日快速发展的数字化办公环境中,选择一个功能全面且高效的办公软件是至关重要的。最近,我有幸体验了ONLYOFFICE 8.1版本的桌面编辑器,这款软件不仅提供了强大的编辑功能,还拥有众多改进,让办公更加流畅和高效。在本…

DCS-11双位置继电器 DC220V 板前接线带底座 约瑟 JOSEF

系列型号: DCS-11双位置继电器; DCS-12双位置继电器; DCS-13双位置继电器; ​用途 RXMVB2(DCS-10)系列双位置继电器用于需要大容量双稳态触点的工业控制和其它一般控制场合。 特点 体积小,拆装方便,能安…