嵌入式LinuxGCC培训.ppt
《嵌入式LinuxGCC培训.ppt》由会员分享,可在线阅读,更多相关《嵌入式LinuxGCC培训.ppt(88页珍藏版)》请在三一办公上搜索。
1、嵌入式Linux GCC培训,主讲老师:欧阳坚,GCC是什么?,GCC:GNU Compiler Collection;GCC支持多种硬件平台和操作系统,能编译多种语言(C,C+,Java,Ada95,Objective C,.etc);GCC与G+的关系:GCC用于编译多种语言编写的程序,主要是C;G+用于编译C+程序,以GCC为基础,编译过程中加入了C+的支持库,参数与GCC基本一致;可以利用GCC编译C+程序,但是需要在参数中加入引用的C+库,比如libstdc+(如gcc-o out lstdc+main.cc)。,可执行程序的生成过程,预处理(Preprocessing):分析各种预
2、处理命令,如#define,#include,#if等;编译(Compilation):根据输入文件产生汇编语言的程序;汇编(Assembly):将汇编语言输入,产生扩展名为.o的目标文件;链接(Linking):以.o目标文件,库文件作为输入,生成可执行文件;,源程序文件(.h,.c,.cc,.etc),经预处理的文件(.i,.ii),汇编语言文件(.s),目标文件(.o),可执行程序(.out),GCC支持的文件类型,C文件.cC源代码.hC头文件C+文件file.hh,file.hC+头文件file.C,file.cc,file.cxx等C+源文件预处理后的文件file.i预处理后的C源
3、文件file.ii预处理后的C+源文件编译后的文件.o目标代码(obj).s汇编代码文件file.a目标文件库,GCC编译选项,命令行:gcc options infile-E不生成文件,只输出预处理结果(输出终端)-S只预处理和编译,把文件编译成为汇编代码greet.s-c预处理,编译和汇编,生成.o的obj文件(greet.o)-o file输出名为file的可执行文件名(缺省为a.out)-O-O2优化编译-g:产生可用于调试的输出-Wall提示更多警告信息-Wstrict-prototypes如果函数的声明或定义没有指出参 数类型,编译器就发出警告.-Wl,option 将option
4、作为选项传递给linker,option 逗号分割,如:,与库和路径相关选项,-I dir 在dir这个目录寻找被include的文件-L dir 在dir这个目录寻找被-l的库-l name 链接库文件名为libname.a 或libname.so的库-fpic或-fPIC 产生位置无关的目标代码,以构造共 享库(shared library)-static 禁止与共享库链接,若没有,则优先 选择共享库链接-shared 产生共享库,在创建共享函数库时使用,示例,与宏相关的选项,-Dmacro:相当于在源程序中使用#define macro 1-Dmacro=value-Umacro:取消宏
5、的定义,3.GCC编译过程,3.1 GCC编译过程,典型的编译过程 test.c 预处理 test.i 编译 test.s 汇编test.o 连接 test$cat test.c(查看程序源代码)#include int main(int argc,char*argv)printf(hello worldn);return 0;$gcc o test test.c(编译连接程序)$./test(执行test程序),3.2 预处理,预编译命令:$gcc-o test.i-E test.c或者$cpp-o test.i test.c 这里cpp不是值c plus plus,而是the C Prep
6、rocessor)执行结果:生成预处理后的文件test.i,该文件包含了test.c需要的所有的类型和函数申明。原理:读取c源程序,对伪指令和特殊符号进行处理。包括宏,条件编译,包含的头文件,以及一些特殊符号。基本上是一个替换的过程。,Hello.c,#include int main(void)printf(“hellon”);预处理命令gcc E hello.c gcc E hello.c o hello.i,注释这一行看看预处理的结果注意#include的作用和用途,-E表示做预处理-o 表示预处理的输出存于hello.i文件中,而不是屏幕上,#define用法,#include#def
7、ine AA 100int main(void)AA BB printf(“hellon”);预处理命令gcc E hello.c DBB=hellogcc E hello.c DBB=“printf(”hello”);”gcc E hello.c DBB(等效于-DBB=1),注释这一行看看预处理的结果,-D表示在命令行中传入宏定义-DBB=后面是一个宏的定义,可以加双引号。,#define带参数,#include#define AA(a,b)a=bint main(void)AA(int a,1);BB;printf(“hellon”);预处理命令gcc E hello.c DBB=hel
8、logcc E hello.c DBB=“printf(”hello”);”,注释这一行看看预处理的结果,-D表示在命令行中传入宏定义-DBB=后面是一个宏的定义,可以加双引号。,展开就成了:int a=1;AA宏带两个参数,#ifdef#if defined#if!defined#ifndef#elif defined#elif!defined#else#if#elif#endif-E D”AA=100”,#define带参数,#include#ifdef AAaa#elif defined BBbb#elif defined CCcc#elseother#endifint main(voi
9、d)printf(“hellon”);,#ifdef AA 等效于#if defined AA表示当定义了宏AA,表示除此之外的情况,表示否则定义了宏CC的情况,gcc E hello.c DAA=1,aaint main(void)printf(“hellon”);,gcc E hello.c DBB=1,bbint main(void)printf(“hellon”);,gcc E hello.c DCC=1,ccint main(void)printf(“hellon”);,gcc E hello.c,otherint main(void)printf(“hellon”);,#if使用,
10、#define带参数,#include#if AAaa#elif BBbb#elif CCcc#elseother#endifint main(void)printf(“hellon”);,#if AA 表示AA非零的情况也就是AA除了0其它数字都为真,表示除此之外的情况,#elif BB 表示BB非零的情况#elif表示否则如果,gcc E hello.c DAA=1,aaint main(void)printf(“hellon”);gcc E hello.c DAA=0otherint main(void)printf(“hellon”);,gcc E hello.c DBB=1,bbin
11、t main(void)printf(“hellon”);gcc E hello.c DBB=0otherint main(void)printf(“hellon”);,gcc E hello.c DCC=1,ccint main(void)printf(“hellon”);gcc E hello.c DCC=0otherint main(void)printf(“hellon”);,gcc E hello.c,otherint main(void)printf(“hellon”);,#的用法,在函数式宏定义中,#运算符用于创建字符串,#运算符后面应该跟一个形参(中间可以有空格或Tab),例如
12、:#define STR(s)#schar*p=STR(helloworld)结果变成:char*p=“helloworld”,#的用法,在宏定义中可以用#运算符把前后两个预处理Token连接成一个预处理Token,和#运算符不同,#运算符不仅限于函数式宏定义,变量式宏定义也可以用。例如:#define FOO(a)foo#aint a=FOO(bar);int b=FOO();预处理之后变成:int a=foobar;int b=foo;,预处理头文件xxx.h,#ifndef HEADER_FILENAME#define HEADER_FILENAME/*body of header*/#
13、endif当xxx.h被多次包含的时候。,有三个头文件和一个C文件,common.h file2.h file3.h main.c,common.h,#ifndef _COMMON_H_#define _COMMON_H_static int test(void)printf(“hellon”);#endif,如果没有写上红色部分的,是什么情况。,file1.h,file1.h文件内容如下#include“common.h”file2.h文件内容如下#include“common.h”,main.c,main.c内容如下#include#include“file1.h”#include“fil
14、e2.h”int main(void)test();,gcc o main main.c,#include 和”区别,#include#include“common.h”,常用的#debug宏定义,int main()printf(“here 1n”);printf(“here 2n”);printf(“here 3n”);,开发阶段太多printf如何在开发阶段加入printf,在程序发布的时候去掉printf呢,常用的#debug宏定义,int main()debug(“here 1n”);debug(“here 2n”);debug(“here 3n”);,#ifdef DEBUG#if
15、 0#define debug printf#else#define debug(var)printf(#var)#endif#else#define debug(var)#endif,常用的#debug宏定义,int main()printf(“here%s%s%dn”,_FILE_,_func_,_LINE_);printf(“here%s%s%dn”,_FILE_,_func_,_LINE_);printf(“here%s%s%dn”,_FILE_,_func_,_LINE_);,太多printf不好区分如何打出printf的时候也打出行号,函数,文件之类的星系,3.3 编译及优化,编译
16、命令:$gcc-o test.s-S test.i(-S编译选项)$gcc-o test.s-S test.i(-S编译选项)$cc1-o test.s test.i(cc1为C语言真正编译器)结果:生成汇编文件test.s,test.s中包含了AT&T的x86汇编代码。作用:通过词法和语法分析,确认所有指令符合语法规则(否则报编译错),之后翻译成对应的中间码,在linux中被称为RTL(Register Transfer Language),通常是平台无关的,这个过程也被称为编译前端。编译后端对RTL树进行裁减,优化,得到在目标机上可执行的汇编代码。gcc采用as作为其汇编器,所以汇编码是A
17、T&T格式的,而不是Intel格式,所以在用gcc编译嵌入式汇编时,也要采用AT&T格式。,3.4 汇编,汇编命令:$gcc-o test.o-c test.s$as-o test.o test.s执行结果:生成目标机器指令文件test.o(可以通过objdump查看汇编指令)原理:把汇编语言代码翻译成目标机器指令,用file test.o 可以看到test.o是一个relocatable的ELF文件,通常包含.text.rodata代码段和数据段。可用readelf-r test.o查看需要relocation的部分。,3.5 链接,执行命令:$gcc-o test test.o执行结果:生
18、成可执行文件test(可用objdump查看)原理:将在一个文件中引用的符号同在另外一个文件中该符号的定义链接起来,使得所有的这些目标文件链接成为一个能被操作系统加载到内存的执行体。(如果有不到的符号定义,或者重复定义等,会报链接错)。用file test 可以看到test是一个executable的ELF文件。,3.6 执行,执行过程$./test,课堂项目(建立一个目录),在src目录中 test1.c test2.c test5.c在include目录中创建test1.h test2.h test5.h文件。在src目录中创建main.c文件然后main.c调用test1.c到test5
19、.c里面的函数。建立obj目录存放目标文件,任务1:编译test1.c test2.c test5.c,编译的test1.o test2.o test5.o放于obj目录中任务2:编译main.c放于obj目录中任务3:编译所有的目标文件形成main文件。任务4:写出build.sh脚本,自动编译和执行main程序任务5:打包整个程序文件夹任务4:学员之间通过网络相互使用build.sh编译对方的程序。,GCC常用编译选项,预编译选项,-DMACRO定义“MACRO”宏为字符串“1”-DMACRO=DEF定义“MACRO”宏为字符串“DEF”-UMACRO取消对“MACRO”宏的定义-E只运行
20、C 预编译器cpp,编译选项,-c只编译并生成object文件-S只预处理和编译,把文件编译成为汇编代码greet.s-g生成可被gdb使用的标准调试信息-ggdb生成只被gdb使用的扩展调试信息-mXXX针对“XXX”CPU进行优化,如“XXX”可以是486、586等-o FILE生成指定的输出文件名“FILE”-O0不进行代码优化-O 或-O1进行一般的代码优化,减少执行代码大小和执行的时间-O2比-O1进行更多的代码优化,一般在内核编译中会使用-O3比-O2 更进一步优化-w不生成任何警告信息-Wall生成所有级别的警告信息-Werror把所有的警告当成错误,并中止编译过程,搜索目录(头
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 LinuxGCC 培训
链接地址:https://www.31ppt.com/p-6569739.html