第9讲-Linux交叉编译环境2
第2章 搭建Linux交叉编译开发环境
码转化为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是⼀个基于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系统下搭建交叉编译环境主要涉及以下几个步骤: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嵌⼊式交叉编译环境的搭建【转】转⾃: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交叉编译环境及工具介绍
一体化电源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 交叉编译简介主机,⽬标,交叉编译器主机与⽬标编译器是将源代码转换为可执⾏代码的程序。
像所有程序⼀样,编译器运⾏在特定类型的计算机上,输出的新程序也运⾏在特定类型的计算机上。
运⾏编译器的计算机称为主机,运⾏新程序的计算机称为⽬标。
当主机和⽬标是同⼀类型的机器时,编译器是本机编译器。
当宿主和⽬标不同时,编译器是交叉编译器。
为什么要交叉编译?某些设备构建程序的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交叉编译程序步骤下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!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架构是非常常见的选择。
设置Linux系统的交叉编译环境
设置Linux系统的交叉编译环境1、在Linaro官⽹上获得交叉编译⼯具从Linaro官⽹上能找到4.9以上版本的交叉编译⼯具,DS5上默认使⽤的是4.8.3版本的交叉编译⼯具2、下载⼀个版本的交叉编译⼯具本⼈还是从其他途径搞到⼀个4.8.3版本的,与DS-5的保持⼀致,毕竟DS-5选择4.8.3作为默认的交叉编译⼯具肯定有他的道理3、将交叉编译⼯具复制到系统的 /opt⽂件⽬录下/opt⽂件⽬录是⽤来保存第三⽅软件的位置,也有的⼈习惯把软件安装到 /usr/local⽬录下。
本⼈习惯放在/opt下,年纪⼤了,路径多了⾃⼰都找不到从桌⾯复制4.8.3交叉编译⼯具到/opt/⽬录输⼊ sudo cp gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz /opt/4、在/opt⽬录下解压缩4.8.3压缩包输⼊ cd /opt命令,到/opt⽬录输⼊sudo tar xvf gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz 解压缩5、解压完就可以看到交叉⼯具链6、输⼊ gedit ~/.profile,使⽤gedit软件打开profile⽂件。
当然也可以⽤vim软件去编辑profile⽂件,但是Vim没有gedit好⽤,看⾃⼰习惯了。
在最后添加路径 export PATH=/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin:$PATH点击Save,关闭⽂件7、使交叉编译⼯具⽣效输⼊source /home/zeli/.profile指令,使交叉编译⼯具⽣效8、在昼短输⼊arm,连续两次敲击Tab键,就能⾃动列出所有的命令,同时也表⽰该交叉编译⼯具⽣效。
linux学习之交叉编译环境
linux学习之交叉编译环境⼀在Linux上配置交叉编译环境:1. 根据芯⽚型号确定芯⽚指令集架构,并根据该架构选择合适的交叉编译⼯具2. 将交叉编译⼯具解压,添加到环境变量。
3. 编译⽬标⽂件,并想法设法将⽬标⽂件整到开发板上,有以下⽅法:将⽬标⽂件先整到windows PC下,拷贝到U盘/SD卡然后再插⼊开发板;⽤⽀持SSH的⼯具如putty登陆板⼦linux服务器;⽤NFS实现。
⼆ Uboot:⽤来启动内核(CPU不能直接从块设备中执⾏代码): 执⾏uboot代码,在uboot中把块设备中的内核代码复制到某内存地址处,然后再执⾏这个地址,即可启动内核。
uboot代码(uboot 根⽬录的spl⽂件夹u-boot-spl.bin和uboot根⽬录下u-boot.bin)需要⽤make(makefile配置+“.config”(make menuconfig图形化配置⼯具的输出⽂件))出来。
然后分别烧录进板⼦。
三编译kernel,并将其烧写进板⼦,启动板⼦后linux的shell环境应该跑起来了。
注意烧录内核的位置和内核运⾏环境: ramdisk根⽂件系统,这个⽂件系统是存在RAM⾥的,所以你在⾥⾯写⼊东西,⼀断电就没有了。
NAND Yaffs2⽂件系统:断电后还是存在的,使⽤busybox⽤来⽣成linux⽂件系统的⼏个基本⽂件夹,然后通过打包⼯具mkyaffs2,它⽤来⽣成能直接烧录到板⼦⾥的镜像⽂件,以下都是要烧写的⽂件。
Image Name Image Type Image start offsetu-boot-spl.bin uboot0x200u-boot.bin data 0x100000env.txt env0x80000970uImage data0x200000rootfs_yaffs2.img data 0x2000000四:将⾃⼰编写的程序的可执⾏⽂件拷贝到/opt⽬录下,并拷贝所需的库⽂件到/lib下,即可通过命令⾏来运⾏⽂件了。
linux交叉编译
移植1一、原理交叉编译就是在一个平台上生成另外一个平台上的可执行代码,这里的平台有两方面的含义:处理器体系结构和所运行的操作系统通常,程序是在一台计算机上编译,然后再分布到将要使用的其它计算机上,当主机系统和目标机系统不兼容时,该该过程叫交叉编译交叉编译有两种模式:Java模式和GNU GCC模式,这里指的是GNU GCC模式。
在宿主机上交叉编译得到可执行文件,通过调试器下载到目标系统中调试运行宿主机(Host):——编辑和编译程序的平台目标机(Target):——用户开发的系统二、目的1.建立交叉开发环境——安装交叉编译器三、准备1. 仔细阅读TQ2440开发板使用手册2.5四、内容安装交叉编译器。
五、设备硬件:PC机一台软件:linux(2.6.x)操作系统。
交叉编译器压缩包六、流程1. 使用命令cd / 进入目录2. 使用命令tar –jxvf EABI_4.3.3_EmbedSKy_20090807.tar.bz2 【-C /】3. 使用命令export PATH= /opt/EmbedSky/4.3.3/bin:$PATH修改环境变量4. 使用命令echo $PATH移植2Boodloader(u-boot)实训流程1. 使用命令cd /进入目录2 使用命令tar –jxvf u-boot-1.1.6_20090824.tar.bz2。
最终解压在/opt/EmbedSky/u-boot-1.1.6中3. 进入该目录/使用命令make EmbedSky_config4. 在使用命令make最终得到一个u-boot.bin文件LINUX内核模块编译步骤:个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.18-1-686. 第一步:获取Linux系统源码第二步:解压系统源码用tar -jxvf命令解压第三步:在系统中添加对ARM的支持第四步:修改平台输入时钟修改平台的时钟频率,以满足TQ2440或SKY2440的工作频率。
linux交叉编译工具的安装
2. 拷贝工具链到根目录下
3. 解压工具链
4. 自动生成/usr/local/arm/3.4.1 目录
5. 在etc/bashrc 中添加环境变量
6. 重起Linux 后查看PATH环境变量并运行交叉
编译工具
交叉编译工具的安装
1. 交叉编译能运行在体系 结构不同的另一种平台上的程序,比如在PC平台 上编译出能运行在X86 CPU 平台上的程序在以 ARM为内核的CPU平台上是不能运行的。相对于 交叉编译,平常做的编译叫本地编译,编译得到 的程序也是在本地执行。用来编译跨平台程序的 编译器就叫交叉编译器。要生成目标机上运行的 程序,必须要用交叉编译工具链来完成。
【VIP专享】Linux交叉编译环境及工具介绍
1、建立内核头文件
Linux Headers
Gcc source
Host gcc
Binutils Source
2
3
Target Binutil tools
Target Bootstrap gcc
Glibc source
Gcc source
Target glibc
Target Full gcc
建立交叉编译环境:
1、建立内核头文件 主要是生成include/linux/version.h 和 include/linux/autoconf.h 文件,这是编 译 glibc 是要用到的,version.h 和 autoconf.h 文件的存在,也说明了你生成了 正确的头文件。
2、针对目标系统的二进制工具binutils; The GNU Binutils are a collection of binary tools. binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序, 如汇编(as)、链接(ld)、静态库归档(ar)、反汇编(objdump)、 elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。 通常,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常 工作的。
4、创建一个交叉编译版本的glibc。 这里最容易出现问题。glibc是一个提供系统调用和基本函数的C语言库,比如 open,malloc和printf等,所有动态链接的程序都要用到它。创建glibc需要的时间 很长。 5、重新创建gcc(称为full gcc)。 因为前面创建gcc的过程没有编译C++编译器,现在glibc已经准备好了,所以这 个步骤将产生一个更完整的full gcc编译器。
linux交叉编译环境
嵌入式Linux开发环境的构建
主要介绍如何构建嵌入式Linux的开发环境, 包括: 1.创建交叉编译工具 2.Linux内核的移植 3.根文件系统的制作 4.Bootloader的移植
1
商用嵌入式LINUX
ARMIRIX Embedded Linux --derived form Debian
Coollogic Coollinux --combines Linux and Java
17
1. 创建交叉编译工具(cont.)
2.建立二进制工具(binutils) binutils包中的工具常用来操作二进制目标文件。该包中最重 要的两个工具就是GNU汇编器as和链接器ld。
3.创建初始编译器(bootstrap gcc) 创建交叉编译版本的Gcc,需要交叉编译版本的glibc,而交 叉编译版本的glibc是通过交叉编译版本的gcc创建的。面对 这个先有鸡还是先有蛋的问题,解决的办法是先只编译对C 语言的支持,并禁止支持线程。
linux交叉编译环境搭建步骤
linux交叉编译环境搭建步骤正文:在进行Linux交叉编译之前,我们需要先搭建好相应的交叉编译环境。
下面是搭建步骤的详细说明:步骤一:安装必要的软件包首先,我们需要安装一些必要的软件包,包括GCC、binutils、glibc 以及交叉编译工具链等。
可以通过包管理器来安装这些软件包,比如在Ubuntu上可以使用apt-get命令,CentOS上可以使用yum命令。
步骤二:下载交叉编译工具链接下来,我们需要下载相应的交叉编译工具链。
可以从官方网站上下载已经编译好的工具链,也可以通过源码自行编译得到。
下载好之后,将工具链解压到一个目录下。
步骤三:配置环境变量为了方便使用交叉编译工具链,我们需要将其添加到系统的环境变量中。
可以通过编辑.bashrc文件来实现,添加类似下面的内容:```shellexport CROSS_COMPILE=/path/to/cross-compiler/bin/arm-linux-export ARCH=arm```其中,/path/to/cross-compiler是你下载的交叉编译工具链的路径。
步骤四:测试交叉编译环境在配置好环境变量之后,我们可以通过简单的测试来验证交叉编译环境是否搭建成功。
比如,可以尝试编译一个简单的Hello World程序,并在目标平台上运行。
步骤五:编译其他软件当交叉编译环境搭建成功,并且测试通过之后,我们就可以使用这个环境来编译其他的软件了。
比如,可以使用交叉编译工具链来编译Linux内核、U-Boot引导程序、驱动程序等。
总结:搭建Linux交叉编译环境是进行嵌入式开发的基础工作之一。
在搭建好环境之后,我们可以使用交叉编译工具链来编译适配于目标平台的软件,从而实现在开发主机上进行开发和调试的目的。
Linux交叉编译环境
开发编译环境1.交叉编译器的安装,与使用以ubuntu-14.04.4-desktop-amd64 为例将附录1的arm_toolchain.tar.gz 选择一个目录COPY过去,(此处以/opt为例)tar zxvf arm_toolchain.tar.gz修改~/.bashrc在最后一行添加将/opt/X3改成你解压的所在目录即可source ~/.bashrc在终端查看是否正确,输入arm后按TAB键若出现安交叉编译器安装正确若不添加该环境变量,则在使用该编译器时,请使用绝对路径如:部分LINUX操作系统,可能存在所需的库并未安装,在编译时若提示未能找到相关库,请自行搜索该库的相应安装若出现arm-Linux-gcc /usr/local/arm/4.3.2/bin/arm-linux-gcc: 行3: /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc: 没有那个文件或目录(No such file or directory)且进入external-toolchain/bin/ 直接运行./ arm-none-linux-gnueabi-gcc出现同样提示,则可能原因是64位系统需要安装32位相应库解决方法:方法一:sudo apt-get install lib32z1方法二:sudo apt-get install g++-multilib方法三:$ sudo dpkg --add-architecture i386$ sudo apt-get update$ sudo apt-get install ia32-libs(工具:附录1-arm_toolchain.tar.gz)2.NFS服务安装首先安装nfs-kernel-serverapt-get install nfs-kernel-serverNFS主要有3类选项:访问权限选项设置输出目录只读:ro设置输出目录读写:rw用户映射选项all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);no_all_squash:与all_squash取反(默认设置);root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);no_root_squash:与rootsquash取反;anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);其它选项secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);insecure:允许客户端从大于1024的tcp/ip端口连接服务器;sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;async:将数据先保存在内存缓冲区中,必要时才写入磁盘;wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);no_wdelay:若有写操作则立即执行,应与sync配合使用;subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;在/etc/exports文件中添加配置:此处添加了二个输出目录作为网络共享目录,可用于挂载在/etc/hosts.allow中添加配置:portmap:192.168.0.0/255.255.0.0 (表示可访问的IP地址)在/etc/hosts.deny中添加配置:portmap:ALL重新启动两个服务:service portmap restartservice nfs-kernel-server restart(其它系统请自行搜索相关方法安装NFS以及启动服务)3.打包与调试终端3.1打包debug版终端机解压附录2pack下面有三个文件夹output, pack_src, pctools,一个脚本文件packpack_src,该文件夹下存放不同项目的文件夹,文件夹名以机器型号命名。
linux交叉编译命令
linux交叉编译命令Linux交叉编译命令随着嵌入式设备的普及,交叉编译成为了开发嵌入式应用程序的常用方法。
Linux作为一种开源操作系统,具有广泛的应用领域,因此,学习Linux交叉编译命令对于开发嵌入式应用程序至关重要。
本文将介绍一些常用的Linux交叉编译命令,帮助读者更好地理解和应用交叉编译技术。
1. 安装交叉编译工具链在进行交叉编译之前,首先需要安装交叉编译工具链。
交叉编译工具链是一组特殊的编译器、链接器和库文件,用于将源代码编译成适用于目标设备的可执行文件。
常见的交叉编译工具链有arm-linux-gcc、mips-linux-gcc等。
安装交叉编译工具链的方法因发行版而异,可以参考相应的文档进行安装。
2. 设置环境变量安装交叉编译工具链后,需要设置环境变量,以便系统能够正确找到交叉编译工具链。
可以通过在.bashrc或者.profile文件中添加如下语句来设置环境变量:export PATH=<交叉编译工具链路径>:$PATH其中,<交叉编译工具链路径>是交叉编译工具链所在的路径。
设置完环境变量后,需要执行以下命令使其生效:source .bashrc或source .profile3. 编译源代码设置好环境变量后,就可以使用交叉编译工具链来编译源代码了。
编译命令的格式通常为:<交叉编译工具链前缀><编译选项><源文件> -o <输出文件>其中,<交叉编译工具链前缀>是交叉编译工具链的前缀,如arm-linux-gcc的前缀是arm-linux-;<编译选项>是一些编译参数,如-Wall表示开启所有警告信息;<源文件>是需要编译的源代码文件;-o <输出文件>表示将编译结果输出到指定文件中。
4. 链接可执行文件编译源代码后,还需要将编译生成的目标文件链接成可执行文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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); }