精华内容
下载资源
问答
  • Linux下交叉编译器学习
    2021-05-13 13:47:06

    最近需要碰到到Linux下的设备使用,需要使用交叉编译器,故在此记录下碰到的问题,以作经验。

    交叉编译器

    梗概

    交叉编译器听起来很玄乎,实则是类似于gcc的编译器,而且大多数情况下,其使用的命令也和gcc一致,语法一致,即你可以在gcc上编译的文件,在交叉编译器上也可以编译,这是用于编译运行在特定的设备上的程序的编译器,只不过不是在PC上。

    安装

    你得到的交叉编译器通常是一个压缩包,如果没有后缀名就在后面加上(.tar/.tar.gz),就可以打开压缩包,其编译的程序通常问arm-xxx-linux-gcc,在目录下的bin文件下,理应解压出来就可以在该目录下直接编译,但是在linux下你需要将该目录加入系统变量,否则其不视之为一个命令。

    增加系统参数

    方法一

    我第一次测试的时候使用了简易而不持续的方法,只可以在这个终端下有效。1export PATH=/usr/local/webserver/mysql/bin:$PATH //将当前目录增加到PATH路径中1echo $PATH //打印PATH路径

    如果看到如下界面就说明当前路径已经加入到PATH路径中。

    /usr/local/webserver/mysql/bin:/usr/local/webserver/mysql/bin/:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    方法二1vim /etc/profile

    在最后,添加:1export PATH="/usr/local/webserver/mysql/bin:$PATH"

    保存,退出,然后运行:1source /etc/profile

    不报错则成功。

    Gcc多文件编译1gcc getop.c calcDemo.c -o output.out

    静态库生成(.a文件)

    编译c文件爱你,生成目标文件

    使用gcc/arm-xxx-linux文件编译c文件,得到.o文件1gcc -c file1.c file2.c

    这样就得到了file1.o file2.o文件

    归档目标文件,生成静态库1ar crv libmylib.a file1.o file2.o

    我们就得到了libmylib.a,这就是我们需要的静态库。

    上述命令中 crv 是 ar的命令选项:c 如果需要生成新的库文件,不要警告

    r 代替库中现有的文件或者插入新的文件

    v 输出详细信息

    通过 ar t libmylib.a 可以查看 libmylib.a 中包含的目标文件。

    可以通过 ar –help 查看更多帮助。

    注意:我们要生成的库的文件名必须形如 libxxx.a ,这样我们在链接这个库时,就可以用 -lxxx。

    反过来讲,当我们告诉编译器 -lxxx时,编译器就会在指定的目录中搜索 libxxx.a 或是 libxxx.so

    使用静态库文件1gcc test.c -L. -lmylib

    将会生成a.out,通过 ./a.out 可以运行该程序。说明我们的静态库能正常工作。

    上面的命令中 -L. 告诉 gcc 搜索链接库时包含当前路径, -lmylib 告诉 gcc 生成可执行程序时要链接 libmylib.a。

    更多相关内容
  • 交叉编译和库文件

    2021-08-21 18:07:44
    如何从源文件到可执行文件4.1 链接4.2 库文件4.3 DLL文件参考链接 一直以来,我一直有个疑惑:编写程序为什么需要编译器。通过搜索,我知道了编译器可以将源代码编译生成可执行文件。下面本文将介绍从源代码到可...

    一直以来,我一直有个疑惑:编写程序为什么需要编译器。通过搜索,我知道了编译器可以将源代码编译生成可执行文件。下面本文将介绍从源代码到可执行文件的变化过程。

    1. 什么是源文件

    程序员可以使用 C 语言、C++、Java 等各种编程语言编写代码,保存代码的文件就是源文件。源文件其实是一种文本文件,所以理论上任何文本编辑器都可以编写源代码,哪怕是 Windows 下的记事本工具也可以。

    下面给出一个源文件的示例,hello.cpp 。
    在这里插入图片描述

    2. 什么是可执行文件

    可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。不同的操作系统,可执行文件的后缀名不同。在windows操作系统下, .exe文件是非常常见的可执行程序。
    其实我并不关心可执行文件的后缀名是什么,我关心的是可执行文件中的内容是什么为啥这个文件可以被执行

    2.1 为什么可执行文件可以执行

    正如我们所知道的,CPU 是计算机的大脑。计算机是通过 CPU 执行程序的。程序员编写的源文件本质上就是文本文件,因此是不可以被 CPU 执行的。CPU 只能解析并运行转换为本地代码的程序内容。不论源代码是用什么编程语言编写的,最后都要转换成本地代码。计算机只能运行本地代码。
    那么问题来了,什么是本地代码?简单来说,本地代码就是可执行文件中的内容。

    2.2 可执行文件的内容

    首先来看下可执行文件中到底有什么。通过编译器,hello.cpp 被编译生成了 hello.exe 文件。用记事本打开 hello.exe 文件,结果如下图所示,是一堆人类理解不了的乱码,如果转为 16 进制,则是一些数值。

    在这里插入图片描述

    十六进制格式的可执行文件类似下图。如果想查看可执行文件的十六进制,可以参考以下经验

    在这里插入图片描述

    3. 编译器

    现在我们知道了,程序员编写的源代码通过编译器可以转换为计算机可以执行的本地代码。现实生活中,程序员可以采用不同的编程语言编写代码,同样编写好的程序也可以运行在不同的计算机上(CPU)。那么编译器是如何实现这一转换过程的呢?

    3.1 不同种类的编译器

    不同的编程语言对应有不同的编译器,例如:负责将 C 语言编写的源代码转换为本地代码的编译器,被称为 C 编译器。
    不同类型的 CPU 也会生成不同类型的本地代码,例如:x86 系列的编译器。
    不同运行环境下的编译器,例如:Windows 用的 C 编译器, Linux 用的 C 编译器。因为编译器本身也是一种程序,所以需要考虑运行环境。

    3.2 交叉编译

    交叉编译是嵌入式开发中非常常见的一个名词。简单来说,交叉编译是指在一个平台上生成另一个平台上的可执行代码。例如:在 x86 平台上,编译生成能运行在 ARM 平台的程序。
    交叉编译器就是用来交叉编译的。交叉编译与本地编译不同,本地编译是指在当前编译平台下,编译生成的程序只能在本地平台运行。例如:在 x86 平台上编译生成针对 x86 平台本身的可执行程序。交叉编译生成的是针对目标平台的程序,因而不能在当前编译平台下运行。

    4. 如何从源文件到可执行文件

    编译器兼具编译链接两个功能。源代码通过编译后会生成扩展名为 .obj 的目标文件,里面的内容是本地代码。

    4.1 链接

    链接是指将多个目标文件结合,生成一个 EXE 文件的处理。链接器就是负责链接的程序。链接时需要源代码对应的目标文件和程序的启动。程序的启动也是一个目标文件,里面记述了和所有程序起始位置相结合的处理内容,它是由编译器提供的 .obj 文件。即使程序不调用其他目标文件的函数,也必须要进行链接,和启动结合起来。

    4.2 库文件

    为了简化链接器参数指定多个目标文件这一过程,库文件应运而生。例如: import32 .lib 就是一个库文件。库文件是多个目标文件的集合,链接器指定库文件后,会从库文件中抽取需要的目标文件,和其他目标文件结合生成 EXE 。库文件中包含的函数被称为标准函数,采用库文件提供函数可以不公开函数的源码。
    如果链接时,不指定相应的库文件,链接器就会报错。错误消息一般为:无法解析的外部符号。 也就是说,无法找到记录目的变量和函数的目标文件,因而无法链接。

    4.3 DLL文件

    Windows 为应用提供了函数的形式的接口 API(Application Programming Interface)。API 本质上是 Windows 提供的一种函数,但它不是标准函数。API的目标文件被存储在 DLL (dynamic link library)中,DLL 文件是程序运行时动态结合的文件,它的扩展名为 .dll ,它本质上是一种特殊的库文件。

    4.4 导入库

    如果一个 .lib 文件中仅存储着信息,如:import32.lib 中仅存储两个信息,MessageBox() 在 user32.dll 这个 DLL 文件中,存储着 DLL 文件的文件夹信息, 而 MessageBox() 目标文件的实体实际并不存在。类似 import32.lib 这样的库文件则称为导入库

    4.5 静态链接库

    存储着目标文件实体,并直接和 EXE 文件结合的库文件形式称为 静态链接库。
    为了方便理解,下图给出了 Windows 中编译和链接机制。

    在这里插入图片描述

    参考链接

    1. 如何使用Notepad++工具查看文件的十六进制
    2. 交叉编译详解 一 概念篇
    3. 程序是怎样跑起来的

    扩展链接

    展开全文
  • 这次扯一下嵌入式开发过程中经常用到的交叉编译器,虽说在之前的文章也提到过这个问题,不过上次是着重介绍为什么使用交叉编译器(主要是为了劝服自己从单片机的思想中脱离出来,慢慢的接受嵌入式Linux开发的一些...

    这次扯一下嵌入式开发过程中经常用到的交叉编译器,虽说在之前的文章也提到过这个问题,不过上次是着重介绍为什么使用交叉编译器(主要是为了劝服自己从单片机的思想中脱离出来,慢慢的接受嵌入式Linux开发的一些约定俗成的工具与方法),而这次的重点一方面是科普交叉编译器的相关知识,另一方面着重介绍怎么使用交叉编译器提供的各种工具完成相应的任务。

    废话少说,上干货。

    交叉编译器选择

    首先认可一点,交叉编译器是一个软件工具,那既然是一个软件,那就必须知道这个软件是怎么来的,目前分为 两种情况。 芯片厂商提供的或者开源的自己制作的交叉编译器。自己制作交叉编译器比较麻烦,虽说制作步骤单一,但版本依赖关系大,而且必须了解编译原理等知识,耗时费力。所以我们果断使用 芯片厂商提供的或者 开源的交叉编译工具链。

    交叉编译器命名规则

    arm-none-linux-gnueabi-
    最最常用的一种,
    第一个单词表示编译得的什么目标架构的
    第二个单词是厂商名,可以是三星或者恩智浦等,但开源的一般都为none
    第三个单词表示程序编译出来的程序默认应用的系统,因为编译器的标准C库等是与Linux兼容的
    第四个单词gnu表示gnu项目
    第四个单词eabi指的是嵌入式接口
    可以简写为以下形式
    arm-linux-
    arm-none-eabi-
    表示编译出来的程序不支持操作系统

    交叉编译器源码目录介绍

    6aa3b40a867ddd9ae36970f5c8e9b706.png交叉编译器包含的目录如上图所示

    • bin目录相当于交叉编译的命令集合,包含了数十种工具。
    • lib相当于交叉编译器运行的时候需要的库以及目标程序所需要的库。在这里我们需要知道,交叉编译器本身是一个程序软件,所以交叉编译器的运行工作需要依赖相关的库文件。另一方面交叉编译器需要将源文件进行编译,而编译得到的另一种架构上的代码运行也需要库文件。这就说明,交叉编译器需要两种库文件,一种是它本身需要的,另一种是编译出来的程序需要的。

    添加交叉编译器命令到环境变量

    为了让交叉编译器的命令不用指定绝对路径使用,所以需要添加环境变量 (如果有不明白什么是环境变量的,还是最好百度一下)。

    • 方案一:

    echo $PATH查看当前系统环境变量

    echo xxx >> PATH追加路径到环境变量,只针对当前shell起作用

    • 方案二:

    编辑/etc/environment文件添加环境变量,可以永久保存。

    但是修改完这个文件以后需要使用source /etc/environment命令将环境变量进行更新

    交叉编译器中嵌入式工具集合

    一、readelf 我们通常理解的程序软件都是运行在 操作系统 之上的,但是有的程序不能在不同的操作系统之上运行,也就是常说的不能跨平台。 这是因为: 我们最终编译出来的可执行程序分两部分: 真正的程序文件以及头信息 不同操作系统的 的格式是不同的,Windows上称为 PE头 ,Linux上称为 ELF头 这个头部信息是专门给 操作系统 识别的。 开发裸机的时候需要使用 objcopy 这个命令将头部信息取出来,留下真正的程序文件。 因为带有头文件的程序刚开始不是可执行代码,裸机状态下无法执行,会导致程序一开始就卡死。 所以我们在裸机开发的时候,在得到二进制文件以后再处理一下得到真正要烧写的文件就是可以理解的了(说实话,这一点我当时非常疑惑) readelf 是读取可执行程序的头部信息 objcopy 是抽取头部信息然后丢弃掉  使用方法: read -h 可执行程序名

    8aab96749f60eaa4583cbec6ef787120.png入口地址表示程序的运行地址,所以一些病毒程序可能就是修改了这个入口地址,相当于我们双击一个原来的程序的时候,直接跳转到了病毒程序 。

    综上所述,在可执行文件的头部有一个头信息可以被操作系统识别,进行解析。

    在Linux上使用file命令可以查看可执行文件的相关信息,比如运行平台架构。59bd533a2b09e7907c5a491796c8fc04.png

    二、size 

    读取可执行程序的大小 包含代码段,数据段,bss段等。a63a2d9b027539b4cc38f3a1cfad1979.png当改变全局变量或者其他的时候,可以看到代码信息的改变。

    关于程序的各种也是一块比较大的知识点,有机会补一篇文章(caa108442714140be83bcace4818906e.pngcaa108442714140be83bcace4818906e.pngcaa108442714140be83bcace4818906e.png)

    三、nm 

    符号列表的概念,最精简,最好用的工具。

    可以查看可执行程序的符号表,比如程序中的全局标签。ac906091dda9eee13a91a6a9a7ac4417.pnga101f6043f5e7f17fe11dae7841abb3a.pngT表示全局函数

    D表示全局变量区

    d表示 static 修饰的变量

    t表示被 static 修饰的函数。

    四、strip

    剔除符号表。

    相当于将刚才说的符号表进行剔除。因为程序运行的时候不需要符号表 ,剔除以后程序所占空间会大大减少。

    使用file命令可以查看是否剔除符号表fb35fd0cfb95520ec38ff87c2521e24d.png剔除符号表以后文件大小会变得更小一点。4bc562ac66923a1b6ac2821ffc8fa3c6.png一般情况下,生产过程最后将最后的程序进行剔除符号表 

    注意:arm架构的交叉编译器工具只能剔除arm架构程序的符号表,不能混用。

    五、strings 

    查看可执行程序的常量字符串。

    da1b529ededecfe252f6787a40499879.png

    六、objcopy 

    表示将头部信息拷出来,不然无法识别相应程序。

    七、objdump 

    反汇编程序

    objdump -d 或者 -D表示反汇编文件。

    为了分析程序以及定位错误,非常常用。

    八、addr2line 

    调试过程中将出错的结果以及行号标志出来 ,但一般用不到。

    展开全文
  • 交叉编译器详解

    千次阅读 2019-11-11 10:35:21
    1.什么是交叉编译器 嵌入式开发一般都是在x86平台下开发,而编译出来的软件要在arm平台上跑,所以需要交叉编译器,交叉的意思就是在一个架构上编译出另一个架构的代码。arm平台一般资源有限,不适合做开发 交叉...

    1.什么是交叉编译器

    嵌入式开发一般都是在x86平台下开发,而编译出来的软件要在arm平台上跑,所以需要交叉编译器,交叉的意思就是在一个架构上编译出另一个架构的代码。arm平台一般资源有限,不适合做开发

    交叉编译器安装方式

    以Linaro gcc为例子:
    1.sudo apt-get install gcc-arm-linux-gnueabihf
    2.官网下载:https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/
    在这里插入图片描述
    在这里插入图片描述

    命名规则

    在这里插入图片描述在这里插入图片描述
    以arm-linux-gnueabihf-gcc为例说明各字段含义
    1.arm表示目标芯片架构,若为大端模式则armeb或者armbe
    2.linux表示运行环境为linux系统,程序可以使用linux下的c标准库或者linux内核提供的API。armeabi-gcc 或 arm-none-eabi-gcc 表示它们的目标程序运行在无操作系统的环境中。实际开发基本都是使用arm-linux-gnueabihf-gcc,包括裸机和uboot,内核代码本身,如果没有用到linux相关的不会出错,但是这样不够严谨,所以最好使用arm-none-eabi-gcc
    3.表示c标准库类型为gnu的glibc库
    4.eabi表示嵌入式架构
    5.hf:硬浮点模式 ,没有hf的表示软浮点模式
    6.编译器版本号,一般都是向下兼容,但是某些程序需要特定版本的编译器

    编译器类型对程序的影响

    编译器 和库要配套,如果使用软浮点编译,提供库文件又是硬浮点模式的就会出错

    展开全文
  • 交叉编译器安装

    2021-07-30 20:28:39
    文章目录一、获取安装包二、修改环境变量三...创建完成以后将刚刚拷贝的交叉编译器复制到/usr/local/arm 这个目录中,在终端使用命令“cd”进入到存放有交叉编译器的目录,比如我前面将交叉编译器拷贝到了目录“/home/l
  • 交叉编译器的安装

    2022-04-29 08:46:29
    交叉编译器的概念 交叉编译器也叫做交叉编译工具链(cross compilation tool chain),是在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,比如在PC平台(X86 CPU)上 编译 出能运行在以ARM为...
  • 构建交叉编译器

    千次阅读 2020-12-20 14:52:55
    申明:本文仅作为云笔记使用而非博客,语言和排版可能会...我使用的是oh-my-zsh,所以需要修改~/.zshrc,在文件末尾添加以下语句. export CC=/usr/bin/gcc-5 export LD=/usr/bin/gcc-5 export PREFIX="/usr/local/i38.
  • 如何构建GCC交叉编译器

    多人点赞 2021-05-24 16:00:38
    如何构建GCC交叉编译器 GCC不仅仅是一个编译器。它是一个开源项目,可以让你构建各种编译器。有些编译器支持多线程;一些支持共享;一些支持multilib。这完全取决于在构建编译器之前如何配置它。 本指南将演示如何...
  • xgo:Go CGO 交叉编译器

    2021-08-04 11:28:55
    xgo - Go CGO 交叉编译器 尽管 Go 努力成为一种跨平台语言,但从一个平台到另一个平台的交叉编译并不像想象的那么简单,因为您需要将 Go 源代码引导到每个平台和架构。 交叉编译的第一步是 Dave Cheney 的包,它...
  • Android编译系统之交叉编译器详解

    千次阅读 2020-03-11 11:34:20
    也就是在/build 目录下,每当我们想新增一个、可执行文件等,只需要添加对应的Android.mk文件即可,具体该文件的通法,详见我之前的博客四、安卓源码分析之Android.mk,而其实Android.mk其实是封装了交叉编译器,...
  • 与使用的交叉编译器为Linux,Windows和MacOS构建Amd64二进制文件(darwin) 用法 将您的项目挂载到/go/src/project_name 调用gouicrossbuild命令, 指定项目名称(以匹配安装点)和要构建的模块的路径。 例子: ...
  • 这是一个非常保险的制作文件系统时拷贝交叉编译器中的动态时用到的shell脚本 #!/bin/bash if [ $# != 1 ] ; then  echo "Usage: $0 [rootfs_path]"  exit; fi INST_PATH=$1 if [ ! -d $INST_...
  • 交叉编译器,ARM EABI编译器区别

    千次阅读 2016-11-01 10:15:45
    首先记录一个下载arm-none-linux-gnueabi-gcc编译器的网址... 命名规则交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi]arch - 体系架构,如ARM,MIPS vendor - 工具链提供商 os - 目标操作系统 eabi
  • 而在开发板上运行的程序则需要arm平台专用的编译器,也称为交叉编译器交叉编译器可以由开发人员手工定制,也可用使用别人已经编译好的,比如arm-linux-gcc;(1)安装交叉编译器----------------------$>cd /home...
  • 这个OPAM信息包含一个用于ARM的OCaml交叉编译器,以及一些为linux-armhf编译的OCaml和程序。 请注意,这里找到的大多数食谱都是改编。 我会调整所需的内容,但我很乐意接受PR。 以下注释也改编自原始存储:...
  • 这里写自定义目录标题一. 准备资源1. 32位的ubuntu系统欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段...只需要准备交叉编译器 欢迎使用M
  • linux下安装配置arm交叉编译器

    千次阅读 2019-05-27 16:16:36
    1、下载并解压交叉编译压缩包 一般由芯片厂商提供,也可以通过网上下载。 2、修改编译器目录bin下可执行程序名字。 由于有的编译的名字并不是arm-linux-***的格式,这样用起来并不是很方便,可以通过ln命令创建软...
  • Linux安装arm交叉编译器 总结一下Linux(本文是基于Ubuntu16.04 64位版)下arm交叉编译工具链的安装及配置步骤,按照此顺序可以避免很多不必要的错误。 注意:建议在执行以下所有命令前先进入root权限模式sudo su...
  • 嵌入式Linux系统移植 嵌入式Linux系统移植是进行Linux驱动开发的基础,如果连Linux系统移植都完成不了,那就更不用说...根文件系统的制作 嵌入式Linux系统的移植基本步骤 确定目标机、主机的连接方式 安装交叉编译...
  • crosstool-ng支持使用cygwin host构建交叉编译器。概述:使用开发包安装cygwin下载 crosstool-ng提取压缩包(tar xvjf crosstool-ng*)跑 ./configure当配置抱怨缺少的工具,回去Cygwin的设置和安装相应的包(例如flex...
  • 关于Linux开发环境搭建,相关安装包库文件均在百度网盘共享,欢迎下载; 共享链接:http://pan.baidu.com/s/1o8SIV8I 密码:ehnf 此处只介绍在当前系统中虚拟出一台电脑,适合初学者,安装成Linux系统,并搭建相应...
  • 交叉编译器的命名规则

    千次阅读 2017-08-08 20:10:03
    转载链接:... =============================================================== 在折腾嵌入式开发,用到交叉编译器的时候,常常会看到这样的名字: arm-xscale-Linux-gnueabi-gcc a
  • 1、交叉编译器简介 1)本地编译 在平时做C开发和Keil软件开发时,都属于本地编译,即在当前PC环境下,直接编译出在当前平台可以运行的程序,这种编译叫做本地编译。 2)交叉编译 交叉编译指在当前平台编译出可以...
  • ARM系列交叉编译器介绍

    千次阅读 2018-09-24 23:57:38
    uClibc/uC-libc以及 newlib都是C语言库文件,只是所应 用的领域不同而已,Glibc是针对PC开发的,uClibc/uC-libc是与Glibc API兼容的小型 化C语言库,实现了Glibc部分功能。  二、arm-linux-eabi 和arm-none-...
  • 库移植就是将src源文件编译生成与开发环境适配的动态库,静态库,安装到指定库路径搜索目录下,列如linux下usr/include(头文件),usr/lib(静态库和动态库)下,这样写程序编译时,就能正确的找到库文件。...
  • 注意:此存储是从官方Flashrom存储派生的,该存储位于: ://review.coreboot.org/cgit/flashrom.git,并对代码进行了某些修改,以便通过DJGPP GCC交叉为DOS平台交叉编译flashrom -Linux上的编译器。...
  • 交叉编译器的制作

    千次阅读 2016-10-27 13:26:41
    为了以后能在arm开发板上运行pc端上的程序,所以必须制作一个交叉编译器,我用的是buildroot-2012.02版本。 *交叉编译器制作步骤: *一.准备交叉编译器源码包 1. 一般我们要把源码包放到我们自己虚拟机的/opt...
  • linux gcc交叉编译器的安装

    千次阅读 2020-03-18 17:54:29
    在Ubuntu环境中,进行ARM嵌入式开发时,Ubuntu自带的x86gcc编译器编译出来的程序不能在ARM芯片上运行,我们需要安装一个交叉编译器gcc,是得编译出来的软件运行在ARM芯片中 1. 下载gcc编译器 我学习使用的gcc交叉...
  • 已经交叉编译好的库文件,可以直接移植到开发板上。使用的交叉编译器arm-fsl-linux-gnueabi-gcc 版本4.6.2 目标板子imx6
  • (一)交叉编译器简介  在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,这个编译过程就叫交叉编译.简单地说,就是在一个平台上生成另一个平台上的可执行代码. (二)体系结构与操作系统 (1)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,294
精华内容 13,317
关键字:

交叉编译器库文件作用