第9讲-Linux交叉编译环境2

合集下载

第2章 搭建Linux交叉编译开发环境

第2章  搭建Linux交叉编译开发环境
g++——gnu的 c++ 编译器。 protoize——与unprotoize相反,将K&R C的源
码转化为ANSI C的形式,函数原型中加入参数 类型。
c++——gnu的c++编译器。
2C0o2p0y/8ri/g4ht © 2003-2007 SinoSys. All Rights Reserved
2C0o2p0y/8ri/g4ht © 2003-2007 SinoSys. All Rights Reserved
双实科技
2.2 建立交叉编译开发工具链
d, 建立编译目录: build-binutils——编译binutils的目录 build-boot-gcc——编译gcc 启动部分

build-glibc——编译glibc的目录 build-gcc——编译gcc 全部的目录 gcc-patch——放gcc的补丁的目录
2C0o2p0y/8ri/g4ht © 2003-2007 SinoSys. All Rights Reserved
双实科技
2.2 建立交叉编译开发工具链
2.2.1 编译工具链
以下是一个基于RedHat linux的交叉编译环境的建立过程。 整个编译过程包括: 1. 下载源文件、补丁和建立编译的目录; 2. 建立内核头文件; 3. 建立二进制工具(binutils); 4. 建立初始编译器(bootstrap gcc); 5. 建立c库(glibc); 6. 建立全套编译器(full gcc)。
2C0o2p0y/8ri/g4ht © 2003-2007 SinoSys. All Rights Reserved
双实科技
2.2 建立交叉编译开发工具链

xmake从入门到精通9:交叉编译详解

xmake从入门到精通9:交叉编译详解

xmake从⼊门到精通9:交叉编译详解xmake是⼀个基于Lua的轻量级现代化c/c++的项⽬构建⼯具,主要特点是:语法简单易上⼿,提供更加可读的项⽬维护,实现跨平台⾏为⼀致的构建体验。

除了win, linux, macOS平台,以及android, ios等移动端平台的内建构建⽀持,xmake也⽀持对各种其他⼯具链的交叉编译⽀持,本⽂我们将会详细介绍下如何使⽤xmake进⾏交叉编译。

交叉编译⼯具链简介通常,如果我们需要在当前pc环境编译⽣成其他设备上才能运⾏的⽬标⽂件时候,就需要通过对应的交叉编译⼯具链来编译⽣成它们,⽐如在win/macos上编译linux的程序,或者在linux上编译其他嵌⼊式设备的⽬标⽂件等。

通常的交叉编译⼯具链都是基于gcc/clang的,⼤都具有类似如下的结构:/home/toolchains_sdkdir- bin- arm-linux-armeabi-gcc- arm-linux-armeabi-ld- ...- lib- libxxx.a- include- xxx.h每个⼯具链都有对应的include/lib⽬录,⽤于放置⼀些系统库和头⽂件,例如libc, stdc++等,⽽bin⽬录下放置的就是编译⼯具链⼀系列⼯具。

例如:arm-linux-armeabi-ararm-linux-armeabi-asarm-linux-armeabi-c++arm-linux-armeabi-cpparm-linux-armeabi-g++arm-linux-armeabi-gccarm-linux-armeabi-ldarm-linux-armeabi-nmarm-linux-armeabi-strip其中arm-linux-armeabi-前缀就是cross,通过⽤来标⽰⽬标平台和架构,主要⽤于跟主机⾃⾝的gcc/clang进⾏区分。

⾥⾯的gcc/g++就是c/c++的编译器,通常也可以作为链接器使⽤,链接的时候内部会去调⽤ld来链接,并且⾃动追加⼀些c++库。

linux交叉编译环境搭建步骤

linux交叉编译环境搭建步骤

linux交叉编译环境搭建步骤在Linux系统下搭建交叉编译环境主要涉及以下几个步骤:2. 配置环境变量:将交叉编译工具链的路径添加到系统的环境变量中以便于使用。

可以在用户的`.bashrc`或`.bash_profile`文件中添加如下行:```bashexport PATH=<path_to_toolchain>/bin:$PATH```其中`<path_to_toolchain>`是指交叉编译工具链所在的路径。

3.设置目标平台的系统根目录:交叉编译时需要使用目标平台的系统库和头文件,因此需要设置目标平台的系统根目录。

可以通过以下方式设置:```bashexport SYSROOT=<path_to_sysroot>```其中`<path_to_sysroot>`是指目标平台的系统根目录。

4.编写一个简单的交叉编译项目:为了验证交叉编译环境是否搭建成功,可以编写一个简单的交叉编译项目进行测试。

例如,编写一个简单的C程序,将其交叉编译为ARM平台下的可执行文件。

```c#include <stdio.h>int maiprintf("Hello, world!\n");return 0;```将上述代码保存为`hello.c`文件。

然后,使用以下命令进行交叉编译:```basharm-linux-gnueabi-gcc -o hello hello.c```编译完成后,会生成一个名为`hello`的可执行文件。

在ARM平台上执行该可执行文件,将输出`Hello, world!`。

以上就是在Linux系统下搭建交叉编译环境的基本步骤。

根据具体的需求,可能还需要进行其他的配置和设置。

交叉编译环境的搭建简介(精)

交叉编译环境的搭建简介(精)

交叉编译环境的搭建简介在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。

这个编译过程就叫交叉编译。

简单地说,就是在一个平台上生成另一个平台上的可执行代码。

这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture、操作系统(Operating System。

同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux forx86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。

有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。

交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。

我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码编译(compile成计算机可以识别和执行的二进制代码。

比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。

这种方式下,我们使用PC 平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。

然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。

这种情况下,在ARM 平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain需要很大的存储空间,并需要很强的CPU 运算能力。

Linux嵌入式交叉编译环境的搭建【转】

Linux嵌入式交叉编译环境的搭建【转】

Linux嵌⼊式交叉编译环境的搭建【转】转⾃:1. 安装标准的C开发环境,由于Linux安装默认是不安装的,所以需要先安装⼀下(如果已经安装好的话,就可以免去这⼀步了): #sudo apt-get install gcc g++ libgcc1 libg++ make gdb2. 下载arm-linux-gcc-3.4.1.tar.bz2到任意的⽬录下,我把它下载到了我的个⼈⽂件夹⾥ /home/wrq arm-linux-gcc-3.4.1.tar.bz2 的下载地址如下:3. 解压 arm-linux-gcc-3.4.1.tar.bz2 #tar -jxvf arm-linux-gcc-3.4.1.tar.bz2 解压过程需要⼀段时间,解压后的⽂件形成了 usr/local/ ⽂件夹,进⼊该⽂件夹,将arm⽂件夹拷贝到/usr/local/下 # cd usr/local/ #cp -rv arm /usr/local/ 现在交叉编译程序集都在/usr/local/arm/3.4.1/bin下⾯了4. 修改环境变量,把交叉编译器的路径加⼊到PATH。

(有三种⽅法,强烈推荐使⽤⽅法⼀) ⽅法⼀:修改/etc/bash.bashrc⽂件#vim /etc/bash.bashrc在最后加上:export PATH=$PATH:/usr/local/arm/3.4.1/binexport PATH ⽅法⼆:修改/etc/profile⽂件:# vim /etc/profile增加路径设置,在末尾添加如下,保存/etc/profile⽂件:export PATH=PATH:/usr/local/arm/3.4.1/bin ⽅法三:#export PATH=PATH:/usr/local/arm/3.4.1/bin 注:(这只能在当前的终端下才是有效的!)5. ⽴即使新的环境变量⽣效,不⽤重启电脑: 对应⽅法⼀:#source /root/.bashrc 对应⽅法⼆:# source /etc/profile6. 检查是否将路径加⼊到PATH: # echo $PATH 显⽰的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加⼊PATH。

Linux交叉编译环境及工具介绍

Linux交叉编译环境及工具介绍

一体化电源Makefile文件介绍:
一体化电源代码目录结构: main---主程序 bin------可执行文件和规约so库 debug---存放主程序各文件的目标文件中间目录
include----主程序用头文件目录
monitor src-----主程序和规约库用头文件目录
ptlmodule---存放规约库文件目录
什么是交叉编译:
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码, 我们就称这种编译器支持交叉编译器。这个编译过程就叫交叉编译。 简单地 说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所 谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Opera ting System)。同一个体系结构可以运行不同的操作系统;同样,同一个操 作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平 台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT 平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
龙腾蓝天1808交叉编译环境:
1、解压缩到指定目录 tar zxvf tool.tar.gz
2、进入linux-devkit目录 3、./environment-setup 4、进入linux-devkit/bin目录,为arm-arago-linux-gnueabi-g++等工 具建立软链接。例如:ln –s arm-arago-linux-gnueabi-g++ arm-linu x-g++ 5、编辑/etc/profile ,添加环境变量。

Linux交叉编译简介

Linux交叉编译简介

Linux交叉编译简介Linux 交叉编译简介主机,⽬标,交叉编译器主机与⽬标编译器是将源代码转换为可执⾏代码的程序。

像所有程序⼀样,编译器运⾏在特定类型的计算机上,输出的新程序也运⾏在特定类型的计算机上。

运⾏编译器的计算机称为主机,运⾏新程序的计算机称为⽬标。

当主机和⽬标是同⼀类型的机器时,编译器是本机编译器。

当宿主和⽬标不同时,编译器是交叉编译器。

为什么要交叉编译?某些设备构建程序的PC,⽤户可以获得适当的⽬标硬件(或模拟器),启动 Linux Release版,在该环境中进⾏本地编译。

这是⼀种有效的⽅法(在处理 Mac Mini时甚⾄可能是⼀个好主意),但对于 linksys 路由器,或 iPod,有⼀些突出的缺点:速度- ⽬标平台通常⽐主机慢⼀个数量级或更多。

⼤多数专⽤嵌⼊式硬件是为低成本和低功耗⽽设计的,⽽不是⾼性能。

由于在⾼性能桌⾯硬件上运⾏,现代模拟器(如 qemu)实际上⽐模拟的许多现实世界的硬件要快。

性能- 编译⾮常耗费资源。

⽬标平台通常没有台式机GB 内存和数百 GB 磁盘空间;甚⾄可能没有资源来构建“hello world”,更不⽤说⼤⽽复杂的包了。

可⽤性-未运⾏过的硬件平台上运⾏ Linux,需要交叉编译器。

即使在 Arm 或 Mips 等历史悠久的平台上,给定⽬标找到最新的全功能预构建本机环境很困难。

如果平台通常不⽤作开发⼯作站,可能没有现成的最新预构建Release版,如果有,则可能已经过时。

如果必须先为⽬标构建Release版,才能在⽬标上进⾏构建,⽆论如何都将返回交叉编译。

灵活性- 功能齐全的 Linux Release版,由数百个软件包组成,但交叉编译环境可以从⼤多数⽅⾯依赖于主机的现有Release版。

交叉编译的重点是构建要部署的⽬标包,不是花时间获取在⽬标系统上运⾏的仅构建先决条件。

⽅便-⽤户界⾯不友好,debug构建中断不⽅便。

从 CD 安装到没有 CD-ROM 驱动器的机器上,在测试环境和开发环境之间来回重新启动。

linux arm交叉编译程序步骤

linux arm交叉编译程序步骤

linux arm交叉编译程序步骤下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!在嵌入式系统开发中,使用ARM架构是非常常见的选择。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

main.o
# A comples example OBJS = main.o display1.o dispaly2.o CC = gcc CFLAGS = -Wall -O -g main : $(OBJS) $(CC) $^ -o $@ main.o : main.c head1.h head2.h $(CC) $(CFLAGS) -c $< -o $@ dispaly1.o : display1.c head1.h $(CC) $(CFLAGS) -c $< -o $@ display2.o: display2.c head2.h $(CC) $(CFLAGS) -c $< -o $@

Gcc编译器
GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编 译系统,能够编译用C、C++和Object C等语言编写的程序。 gcc不仅功能强大,而且可以编译如C、C++、Object C、 Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且 gcc又是一个交叉平台编译器,它能够在当前CPU平台上为 多种不同体系结构的硬件平台开发软件,因此尤其适合在 嵌入式领域的开发编译。
模式规则是用来定义相同处理规则的多个文件的。它不同 于隐式规则,隐式规则仅仅能够用make默认的变量来进行 操作,而模式规则还能引入用户自定义变量,为多个文件 建立相同的规则,从而简化了makefile的编写 模式规则的格式类似于普通规则,这个规则中的相关文件 前必须用“%”标明 OBJS =main.o prinfun.o maxfun.o CC = gcc CFLAGS = -Wall -O -g main : $(OBJS) $(CC) $^ -o $@ %.o : %.c $(CC) $(CFLAGS) -c $< -o $@
创建和使用makefile变量
用来代替一个文本字符串, 变量替换后的Makefile文件 可以代替:目标体、依赖文 件、命令及其它 OBJS = main.o prinfun.o maxfun.o 变量定义的两种方式 CC = gcc
递归展开方式VAR=var CFLAGS = -Wall -O -g main : $(OBJS) 简单方式 VAR:=var $(CC) $(OBJS) -o main
Gcc编译过程
预处理 #gcc –E hello.i –o hello.s 编译 #gcc –S hello.i –o hello.s 汇编 #gcc –c hello.s –o hello.o 链接 #gcc hello.o –o hello
主要内容
1 基本概念 2 基本结构 3 4 5 Makefile变量 makefile 规则
makefile变量
变量种类 用户自定义变量 预定义变量 自动变量 环境变量
makefile中常用的预定义变量
makefile中常用的自动变量
命令格式 $* 含义 不包含扩展名的目标文件名称
$+ $<
$?
所有的依赖文件,以空格分开,并以出现的先后为序,可能 包含重复的依赖文件 第一个依赖文件的名称
一个稍微复杂的例子
main.c #include "head1.h" #include "head2.h" int main( ) { int a, b, c; scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); a=maxfun(a, b, c); prnfun(a); return a; } maxfun.c #include "head2.h" int maxfun(int a2, int b2, int c2) { int temp=0; if (a2>b2) prnfun.c { if (a2>c2) #include "head1.h" temp=a2; else void prnfun(int x) temp=c2; { } printf("The maximum value is: %d\n", x); else return; { } if (b2>=c2) temp=b2; else temp=c2; } return temp; }
隐式规则
隐含规则能够告诉make怎样使用传统的规则完成任务,这 样,当用户使用它们时就不必详细指定编译的具体细节, 而只需把目标文件列出即可 OBJS main.o prinfun.o maxfun.o 例子
CC = gcc CFLAGS = -Wall -O -g main : $(OBJS) $(CC) $^ -o $@
main
将实验四的源文件拆开成为具有如下依赖关系的源文件,并编写隐式 规则和模式规则的Makefile文件
display1.o
Diaplay1在head1.h 中 Dispaly2在head2.h中
display1.c
display2.c
head1.h
main.c
head2.h
display2.o
变量使用$(VAR)
main.o : main.c head1.h head2.h $(CC) $(CFLAGS) -c main.c -o main.o prinfun.o : prnfunc.c head1.h $(CC) $(CFLAGS) -c prnfunc.c -o prinfun.o maxfun.o: maxfunc.c head2.h $(CC) $(CFLAGS) -c maxfunc.c -o maxfun.o
作业
MAKE工程管理器
工程管理器,顾名思义,是指管理较多的文件 Make工程管理器也就是个“自动编译管理器”,这里的 “自动”是指它能根据文件时间戳自动发现更新过的文件 而减少编译的工作量,同时,它通过读入Makefile文件的 内容来执行大量的编译工作,具体如下: 查找当前目录下的Makefile文件 初始化文件中的变量 分析Makefile中的所有规则 为所有目标文件创建依赖关系 根据依赖关系,决定哪些目标文件要重新生成 执行生成命令
makefile基本结构
Makefile规则的一般形式如下: target:dependency dependency (tab)<command> 例如:有以下的Makefile文件: test:prog.o code.o gcc prog.o code.o –o test prog.o:prog.c prog.h code.h gcc –c prog.c –o prog.o code.o:code.c code.h gcc –c code.c –o code.o
第9讲 Linux交叉编 译环境(2)
复习:嵌入式软件开发的流程
软件概要设计
软件详细设计
程序开发 (ADS, IAR. KLeabharlann il等) 程序移植 编译,调试,烧写
软件实现
软件测试
软件开发的工具
编辑器 Vi \Gedit \Emacs 编译器 Gcc 调试器 Gdb 项目管理工具 make
所有时间戳比目标文件晚的依赖文件,并以空格分开
$@
$^ $%
目标文件的完整名称
所有不重复的依赖文件,以空格分开 如果目标是归档成员,则该变量表示目标的归档成员名称
用自动变量进一步简化makefile文件
OBJS = main.o prnfunc.o maxfunc.o CC = gcc CFLAGS = -Wall -O -g main : $(OBJS) $(CC) $^ -o $@ main.o : main.c head1.h head2.h $(CC) $(CFLAGS) -c $< -o $@ prnfunc.o : prnfunc.c head1.h $(CC) $(CFLAGS) -c $< -o $@ maxfunc.o: maxfunc.c head2.h $(CC) $(CFLAGS) -c $< -o $@
makefile基本结构
makefile是make读入的惟一配置文件,因此 本节的内容实际就是讲述makefile的编写规 则。在一个makefile中通常包含如下内容: 需要由make工具创建的目标体(target), 通常是目标文件或可执行文件;(如之前的 hello.o, hello) 要创建的目标体所依赖的文件 (dependency_file, 一般是头文件); 创建每个目标体时需要运行的命令 (command),这一行必须以制表符(tab 键)开头。(如gcc命令)
makefile基本结构
一个简单的例子(步骤): 1. 在根目录下新建目录: #mkdir tx12_39 2. 编辑源程序hello.c和hello.h
#vi hello.c #include “hello.h” int main( ) { printf(“Hello everyone!\n”); return 0; } 3. 编写Makefile文件 #vi Makefile #A simplest example hello: hello.c hello.h gcc –c hello.c –o hello 4. 使用Makefile #make hello 5. 查看是否生成可执行文件:#ls #vi hello.h #ifndef _HELLO_H_ #define _HELLO_H_ #include “stdio.h” #endif
模式规则
作业
#include <stdio.h> int display1(char *string); int display2(char *string1); int main() { char string[]="Embedded Linux"; display1 (string); display2 (string); } int display1 (char *string) { printf ("The original string is %s \n", string); } int display2 (char *string1) { char *string2; int size, i; size = strlen (string1); string2 = (char *) malloc (size +1); for (i = 0; i < size; i++) string2[size-i-1]= string1[i]; string2[size+1]= ' \0'; printf("The string afterward is %s\n",string2); }
相关文档
最新文档