




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
湖北经济学院 电子工程系 嵌入式Linux系统实验五:Linux编程环境 gcc与make1 实验目的通过实验掌握Linux中的gcc 和 make2 实验设备硬件:PC机一台软件:Windows98/XP/2000系统,VMware Workstation6.0,Red Hat Linux 3 实验内容(1) Linux命令gcc和make4 实验预习要求仔细阅读参考书:【1】鸟哥的Linux私房菜 基础学习篇 第三版,人民邮电出版社,鸟哥【2】嵌入式Linux系统开发标准教程,人民邮电出版社,华清远见嵌入式培训中心【3】嵌入式Linux应用程序开发标准教程,人民邮电出版社,华清远见嵌入式培训中心关于Linux编程环境部分。5 实验步骤(1)熟悉Red Hat Enterprise Linux系统。(2)根据实验重点内容测试。6 实验重点:gcc的用法(1)简单的示例程序示例程序 hello.c 见 gccexample-hello在默认的状态下,如果直接以 gcc 编译源代码,并且没有加上任何参数,则执行文件的文件名会被自动设置为 a.out 这个文件名! 所以能够直接执行 ./a.out 这个可执行文件!如果想要产生目标文件 (object file) 来进行其他的操作,而且可执行文件的文件名也不要用默认的 a.out ,步骤:rootwww # gcc -c hello.c rootwww # ll hello* -rw-r-r- 1 root root 72 Jun 5 02:40 hello.c -rw-r-r- 1 root root 868 Jun 5 02:44 hello.o =就是被生成的目标文件 rootwww # gcc -o hello hello.o rootwww # ll hello* -rwxr-xr-x 1 root root 4725 Jun 5 02:47 hello =这就是可执行文件!-o 的结果 -rw-r-r- 1 root root 72 Jun 5 02:40 hello.c -rw-r-r- 1 root root 868 Jun 5 02:44 hello.o rootwww # ./hello Hello World这个步骤主要是利用 hello.o 这个目标文件生成出一个名为 hello 的可执行文件。我们可以得到 hello 及 hello.o 两个文件, 真正可以执行的是 hello 这个二进制文件。为什么要先制作目标文件再做成可执行文件呢?(2)主、子程序链接:子程序的编译如果我们在一个主程序里面又调用了另一个子程序呢?这是很常见的一个程序写法,因为可以简化整个程序的易读性!在如下的例子当中,我们以 thanks.c 这个主程序去调用 thanks2.c 这个子程序,见程序gcc-example-thanks# 开始将源代码编译成为可执行的 二进制文件 : rootwww # gcc -c thanks.c thanks2.c rootwww # ll thanks* -rw-r-r- 1 root root 76 Jun 5 16:13 thanks2.c -rw-r-r- 1 root root 856 Jun 5 16:13 thanks_2.o =编译产生的! -rw-r-r- 1 root root 92 Jun 5 16:11 thanks.c -rw-r-r- 1 root root 908 Jun 5 16:13 thanks.o =编译产生的! rootwww # gcc -o thanks thanks.o thanks_2.o #最终结果会产生thanks#执行一下这个文件: rootwww # ./thanks Hello World Thank you!为什么要制作出目标文件?由于我们的源代码文件有时并非仅只有一个文件,所以我们无法直接进行编译。 这个时候就需要先产生目标文件,然后再以链接制作成为 binary 可执行文件。另外,如果更新了 thanks2.c 这个文件的内容,则只要重新编译 thanks2.c 来产生新的 thanks2.o ,然后再以链接制作出新的 binary 可执行文件即可!而不必重新编译其他没有更改过的源代码文件。 这对于软件开发者来说,这是一个很重要的功能,因为有时候要将很大的源代码全部编译完成,会花很长的一段时间!(3)调用外部函数库:加入链接的函数库示例程序中使用了三角函数库中的sin()方法。见程序gcc-example-sin直接使用gcc sin.c 会报错。这是因为 C 语言里面的 sin 函数是写在 libm.so 这个函数库中,而我们并没有在源代码里面将这个函数库功能加进去, 所以当然就需要在编译和链接的时候将这个函数库链接到可执行文件中我们可以这样做: 编译时加入额外函数库链接的方式rootwww # gcc sin.c -lm -L/lib -L/usr/lib =重点在 -lm rootwww # ./a.out 1.000000特别注意,使用 gcc 编译时所加入的那个 -lm 是有意义的,他可以拆开成两部份来看: -l :是“加入某个函数库(library)“的意思, m :是 libm.so 函数库,其中,lib与扩展名(.a 或 .so)不需要写 所以 -lm 表示使用 libm.so (或 libm.a) 这个函数库的意思,后面的-L表示: “所要的函数库 libm.so 到 /lib 或 /usr/lib 里面查找!“,要注意的是,由于 Linux默认是将函数库放置在 /lib 或 /usr/lib 中,所以没有写 -L/lib 或-L/usr/lib 也没有关系!但是,如果使用的函数库并非放置在这两个目录下,那么 -L/path 就很重要了!否则会找不到函数库! 除了链接的函数库之外,在 sin.c 当中第一行 #include ,这个文件其实是放置在 /usr/include/stdio.h 中的!那么万一这个文件并非放置在这里呢?那么我们就可以使用下面的方式来定义出要读取的 include 文件放置的目录: gcc sin.c lm I/usr/include-I/path 后面接的路径( Path )就是要去查找相关的 include 文件的目录!不过,同样的,默认值是放置在 /usr/include 下,除非所 include 文件放置在其他路径,否则也可以略过这个选项!(4)gcc的一些例子# 仅将源代码编译成为目标文件,并不制作链接等功能: rootwww # gcc -c hello.c # 会自动的产生 hello.o 这个文件,但是并不会产生 binary 执行文件。# 在进行二进制文件 制作时,将连结的函数库与相关的路径填入 rootwww # gcc sin.c -lm -L/usr/lib -I/usr/include # 这个指令在最终连结成二进制文件 的时候,-lm 指的是 libm.so 或 libm.a 这个函数库文件;-L后面接的路径是刚刚上面那个函数库的搜寻目录; # -I 后面接的是源代码内的 include 文件所在目录。# 将编译的结果输出成某个特定文件名 rootwww # gcc -o hello hello.c # -o 后面接的是要输出的 二进制文件 文件名Make的用法(1)为什么要用 make 假设项目包含四个源代码文件,分别是 main.c haha.c sin_value.c cos_value.c 四个文件,见gcc-example-makefile这四个文件的目的是: main.c :主要的目的是让用户输入角度数据并调用其他三个子程序; haha.c :输出一堆信息; sin_value.c :计算使用者输入的角度(360) sin 数值; cos_value.c :计算使用者输入的角度(360) cos 数值。 由于这四个文件里面包含了相关性,并且还用到数学函数在里面,所以如果想要让这个程序可以运行, 那么就需要这样编译:# 1. 先进行目标文件的编译,最终会有四个 *.o 的文件名出现: rootwww # gcc -c main.c rootwww # gcc -c haha.c rootwww # gcc -c sin_value.c rootwww # gcc -c cos_value.c # 2. 再进行链接生成可执行文件,并加入 libm 的数学函数,以生成 main可执行文件: rootwww # gcc -o main main.o haha.o sin_value.o cos_value.o -lm -L/usr/lib -L/lib # 3. 本程序的执行结果,必须输入姓名、360 度角的角度值来计算: rootwww # ./main 编译的过程需要进行如此多的操作!而且如果要重新编译,则上述的流程得要重新来一遍,足见麻烦! 如果可以的话,能不能一个步骤就完成上面所有的操作?那就利用 make 工具! 先在这个目录下建立一个名为 makefile 的文件,内容如下: # 1. 先编辑 makefile 这个规则文件,内容只要作出 main 这个执行文件 rootwww # vim makefile main: main.o haha.o sin_value.o cos_value.o gcc -o main main.o haha.o sin_value.o cos_value.o lm# 注意:第二行的 gcc之前是 按键产生的空格!# 2. 使用 makefile 制订的规则进行编译的行为: rootwww # rm -f main *.o =先将之前的目标文件删除 rootwww # make cc -c -o main.o main.c cc -c -o haha.o haha.c cc -c -o sin_value.o sin_value.c cc -c -o cos_value.o cos_value.c gcc -o main main.o haha.o sin_value.o cos_value.o -lm # 此时 make 会去读取 makefile 的内容,并根据内容直接去编译相关的文件!# 3.在不删除任何文件的情况下,重新执行一次编译的操作: rootwww # make make:main is up to date. #是否很方便!只会进行更新 (update) 的操作而已。以上仅写出 main 需要的目标文件,结果 make 会主动的去判断每个目标文件相关的源代码文件,并直接予以编译,最后再直接进行链接的操作!此外,如果更改某些源代码文件,则 make 也可以主动的判断哪一个源代码与相关的目标文件文件有更新过, 并仅更新该文件,如此一来,将可大大的节省很多编译的时间!某些程序在进行编译时,会消耗很多的 CPU 资源!所以说, make 有这些好处: l 简化编译时所需要执行的指令; l 若在编译完成后,修改了某个源代码文件,则 make 仅会针对被修改了的文件进行编译,其他的 object file 不会被更改; l 最后可以依照相依性来更新 (update) 执行文件。 (2)makefile的语法规则make 里面最需要注意的是规则文件,也就是 makefile 这个文件的语法#注释目标文件:依赖文件列表命令行表说明:注释:makefile的注释采用 #开头目标文件:目标文件通常指程序编译过程中生成的 目标文件(.o文件)或者是最终的可执行程序,也可以是要执行的动作,如 clean 这样的目标。依赖文件:目标文件所依赖的文件,一个目标文件可以依赖一个或多个文件。:分号:分隔符,介于目标文件和依赖文件之间。命令行表:make 程序执行的动作,也是创建目标文件的命令,一个规则可以有多条命令,每一行只能有一条命令。每一个命令行必须以TAB键开始,TAB键告诉make程序该行是一个命令行,make按命令完成相应的动作。示例gcc-example-makefile 中,如果想要有两个以上的执行操作时, 例如执行一个指令就直接清除掉所有的目标文件和执行文件,该如何处理? # 1. 先编辑 makefile 来建立新的规则,此规则的目标名称为 clean : rootwww # vi makefile main: main.o haha.o sin_value.o cos_value.o gcc -o main main.o haha.o sin_value.o cos_value.o -lm clean: rm -f main main.o haha.o sin_value.o cos_value.o # 2. 以新的目标 (clean) 测试看看执行 make 的结果:rootwww # make clean =就是这里!通过 make 以 clean 为目标rm -rf main main.o haha.o sin_value.o cos_value.o在这个例子中 makefile 里面就具有至少两个目标,分别是 main 和 clean ,如果我们想要建立 main 的话,输入 “make main”,如果想要清除信息,输入“make clean“即可!而如果想要先清除目标文件再编译 main 这个程序的话
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 婴幼儿安全培训记录内容课件
- 婴儿安全急救知识培训课件
- 工业消防安全培训会议课件
- 年味风味鱼干课件
- 涿州事业单位笔试真题2025
- 2025年自贡市事业单位考试真题
- 油茶青果买卖合同山茶果合同6篇
- 平面向量的夹角课件
- FIT-039-Standard-生命科学试剂-MCE
- 烟台事业单位笔试真题2025
- 农业现代化种植技术培训课件
- 中城汽车(山东)有限公司审计报告
- 锂电池pack工厂安全培训课件
- 大学博士竞赛试题及答案
- 钢结构彩钢瓦施工工艺与技术交底
- 2025版煤矿安全规程宣贯培训课件
- 梁启超家教家风课件
- 第5课 我们说方言教学设计-2025-2026学年小学地方、校本课程浙教版(2024)人·自然·社会
- (2025秋新版)青岛版科学三年级上册全册教案
- 顾客联络服务 人工与智能客户服务协同要求 编制说明
- 2025年全国通信专业技术人员职业水平考试(通信专业实务·传输与接入·无线)历年参考题库含答案详解(5套)
评论
0/150
提交评论