LinuxC编程基础.ppt

上传人:小飞机 文档编号:6511135 上传时间:2023-11-08 格式:PPT 页数:33 大小:316.49KB
返回 下载 相关 举报
LinuxC编程基础.ppt_第1页
第1页 / 共33页
LinuxC编程基础.ppt_第2页
第2页 / 共33页
LinuxC编程基础.ppt_第3页
第3页 / 共33页
LinuxC编程基础.ppt_第4页
第4页 / 共33页
LinuxC编程基础.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《LinuxC编程基础.ppt》由会员分享,可在线阅读,更多相关《LinuxC编程基础.ppt(33页珍藏版)》请在三一办公上搜索。

1、第二章 Linux C编程基础-GCC,主要内容,gcc简介利用gcc编译c程序利用make工具简化编译过程调试,开发工具环境,开发工具:编辑工具、编译工具和调试工具,甚至配置工具和项目管理工具。开发环境:(1)基于文本的:vim+gcc+gdb+make(2)集成开发平台:Eclipse+CDT、,基于文本的开发平台,编辑工具:vim,emacs。编译工具:gcc,要使用指令完成编译,比如:gcc o hello hello.c调试工具:gdb。项目管理工具:make,编写makefile文档来完成相关的一系列gcc指令。,gcc简介,名称:GNU project C and C+Compi

2、ler GNU Compiler Collection gcc是一个全功能的ANSIC兼容编译器,它是所有UNIX系统可用的C编译器。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30%。,gcc简介,对C/C+编译的控制预处理:对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。编译:就是把C/C+代码“翻译”成汇编代码。汇编:将第二步输出的汇编代码翻译成符合一定格式的机器代码,生成以.s为后缀的目标文件。链接:将上步生成的目标文件和系统库的目标文件和库文件链接起来,最终生成了可以在特定平台运行的

3、可执行文件。,编译过程的四个阶段:,gcc的使用,基本使用格式$gcc 选项 文件名例:,/text.c#includevoid main()printf(“Hello World!n”);,$gcc test.c$./a.outHello World!或$gcc-o test test.c$./testHello World!,常用选项及含义,gcc的常用选项,gcc的常用选项,gcc的常用选项,-Wall:允许所有有用的警告(建议总是使用该选项),/*bad.c*/#include int main(int argc,char*argv)printf(“Two plus two is%fn

4、”,4);return 0;,例1:$gcc bad.c o bad例2:$gcc Wall bad.c o bad,13,例1:,-o:定义输出文件,例:编译多个源文件$gcc-Wall main.c hello.c-o helloworld,/*hello.h*/void hello(const char*name);,/*hello.c*/#include#include hello.h void hello(const char*name)printf(Hello,%s!n,name);,/*main.c*/#include hello.h int main(int argc,char

5、*argv)hello(world);return 0;,14,例2:,-l:链接外部库文件,库是已经编译好并能被链接入程序的对象文件的集合。库中提供一些最常用的系统函数,比如象C的数学库中求平方根函数sqrt。,库通常被存储在扩展名为“.a”或“.so”的特殊归档文件中。,C标准库自身存放在“/usr/lib/libc.a”中,包含ANSI/ISO C标准指定的各个函数,是默认自动加载的库。,/*sqrt.c*/#include#include int main(int argc,char*argv)double r=sqrt(3.0);printf(The square root of 3

6、.0 is%fn,r);return 0;,例:$gcc-Wall sqrt.c-o sqrt,ccbR6Ojm.o:In function main:ccbR6Ojm.o(.text+0 x19):undefined reference to sqrt,15,例:,-l:链接外部库文件,函数sqrt()并不定义在源程序中或默认的C库“libc.a”中。,为了使得编译器能把sqrt()函数链接到主程序“sqrt.c”,需要提供“libm.a”库。,例:$gcc-Wall sqrt.c/usr/lib/libm.a-o sqrt,/usr/lib/libm.a,-lm,$gcc-Wall sqr

7、t.c-lm-o sqrt,编译器选项“-lNAME”试图链接标准库目录下的文件名为“libNAME.a”中的对象文件,16,例:,函数库的链接次序,原则:包含函数定义的库应该出现在任何使用到该函数的源文件和对象文件之后,例1:$gcc-Wall-lm sqrt.c-o sqrt(incorrect)$gcc-Wall sqrt.c-lm-o sqrt(correct),例2:$gcc-Wall sqrt.c-lglpk-lm-o sqrt,程序“sqrt.c”用到了GNU Linear Programming库“libglpk.a”,而该库又依次用到数学库“libm.a”,那么应当这么编译:

8、,17,例:,-L:设置库文件的搜索路径,如果链接时用到的库不在gcc用到的标准库目录中,就会报这样的错。,/usr/local/lib/usr/lib/,例:$gcc-Wall-L/tmp/lib sqrt.c-lm-o sqrt,-L/tmp/lib,18,例:,-I:设置头文件的搜索路径,如果头文件不在gcc用到的标准include文件路径中,就会报这样的错。,/usr/local/include/usr/include/,例:$gcc-Wall-I/tmp/include sqrt.c-lm-o sqrt,-I/tmp/include,19,例:,gcc文件扩展名规范,gcc可以根据文

9、件扩展名执行操作,使用gcc编译代码,源代码,示例源程序hello.c#include int main(void)printf(hello gcc!rn);return 0;,生成预处理文件,命令:E选项使得gcc生成预处理文件后停止。$gcc E hello.c o hello.i,预处理文件hello.i的部分内容.extern void funlockfile(FILE*_stream);#679/usr/include/stdio.h 3#2 hello.c 2int main(void)printf(hello gcc!n);return 0;,生成汇编文件,命令$gcc S he

10、llo.c o hello.s,汇编文件hello.s的部分内容.main:pushl%ebpmovl%esp,%ebp.addl$16,%espmovl$0,%eaxleaveret.,生成二进制文件,生成目标文件命令:$gcc c hello.c o hello.o生成可执行文件命令:$gcc hello.c o hello运行程序$./hellohello gcc!,利用gcc开发C语言程序,开发C/C+程序的基本步骤是:首先利用文本编辑工具编写源代码,然后将源代码作为输入文件,通过使用不同的控制参数控制gcc实现代码的预处理、编译、汇编、链接等步骤,生成最终的可执行文件。,简单C语言程

11、序my_app.c,#include#define N 10Void greeting(char*name);int main(void)char nameN;printf(Your Name,Please:);,scanf(%s,name);greeting(name);return 0;void greeting(char*name)printf(Hello%s!rn,name);,使用什么命令生成可执行文件?,$gcc my_app.c o my_app,多个文件的C程序,为了方便代码重用,通常将主函数和其他函数放在不同文件中的方法。每个函数都有函数声明(函数头)和函数实现(函数体)两部

12、分组成。函数头一般放在头文件中(*.h)中,而函数的定义文件放在实现文件(*.c、*.cpp)中,编译多个文件,假设3个文件保存在同一个目录下面,如果还使用:命令:$gcc my_app.c o my_app会编译通过吗?,编译多个文件,目录结构(1)编译命令$gcc my_app.c greeting.c o my_app目录结构(2)编译方式(1)$gcc my_app.c functions/greeting.c o my_app-I functions,编译多个文件,目录结构(2)编译方式(2)分步编译命令:1、$gcc-c my_app.c-I functions 2、$gcc-c functions/greeting.c3、$gcc my_app.o greeting.o o my_app思路:编译每一个.c文件,得到.o的目标文件;将每一个.o的目标文件链接成一个可执行的文件;,GNU C 扩展简介,gcc使用long long数据类型提供64位存储单元。内联函数:要求内联函数足够短小,使得能够在代码中展开,同时编译器检查函数类型。要使用-O选项。-finline-functions.使用attribute关键字指明代码相关信息方便优化。gcc对case做了扩展。case语句可以对应一个范围,在case关键字后列出范围的两个边界值,用“空格省略号空格”分隔。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号