C语言学习013:通过make编译C源代码

编译多个C源代码文件

  当程序文件越来越多,修改了其中的一部分代码文件,我们并不需要全部重新编译,只需要编译其中一部分就可以,下面我们创建了一个launch程序,除了主程序,我们创建了3个功能代码文件reaction.c pitch.c engine.c

1 #include <stdio.h>
2 #include "lac.h"
3
4 void reaction(){
5     printf("reaction \n");
6 }
1 #include <stdio.h>
2 #include "lac.h"
3
4 void pitch(){
5     printf("pitch \n");
6 }
1 #include <stdio.h>
2 #include "lac.h"
3
4 void engine(){
5     printf("engine \n");
6 }
1 #include <stdio.h>
2 #include "lac.h"
3
4 int main(){
5     reaction();
6     pitch();
7     engine();
8     return 0;
9 }

  首先将源代码编译为目标文件

  gcc -c *.c

  *.c会匹配当前目录下的所有C源文件,-c会告诉编译器为所有源文件创建目标文件

  然后通过下面的命令,编译器会过滤掉代码文件,将目标文件链接起来,行程launch程序

  gcc *.o -o launch

  如果我们修改了其中一个文件,只需要编译修改的文件,然后再将目标文件连接起来,这样就可以不必编译所有的文件了

用make工具自动化构建

  那么问题来了,如果修改的文件很多,编译的时候我们就很难记得修改了哪些文件,当然也可以把所有文件都重新编译,但是那样效率很低,有没有什么办法让它自动编译呢?下面我们就通过make工具自动化构建

  make编译的文件叫目标,对每个目标它需要知道两件事情:依赖项(生成文件需要用哪些文件)和生成方法(生成该文件时需要哪些指令);依赖项和生成方法合起来就构成了规则,有了规则,make就知道如何生成目标

  比如,要将reaction.c编译成目标文件reaction.o;那么reaction.o就是目标,reaction.c是依赖项,生成方法就是将reaction.c转化为reaction.o的编译命令 gcc -c reaction.c;创建完目标文件后,我们需要将所有目标文件链接在一起,就是通过 gcc *.o -o launch命令,*.o匹配所有目标文件;如果只是需要链接一部分目标文件,就需要将要链接的目标文件逐个列出来,像这样: gcc launch.o reaction.o  -o launch

  现在我们就将所有的目标、依赖项和生成方法保存到makefile(或者是Makefile)文件,然后将该文件放在源程序文件同目录中

 1 launch.o: launch.c lac.h
 2     gcc -c launch.c
 3 reaction.o: lac.h reaction.c
 4     gcc -c reaction.c
 5 pitch.o: lac.h pitch.c
 6     gcc -c pitch.c
 7 engine.o: lac.h engine.c
 8     gcc -c engine.c
 9 launch: launch.o reaction.o pitch.o engine.o
10     gcc *.o -o launch

  需要注意的是,生成方法都是tab开头

  现在可以打开控制台开始编译代码了;在unix系统中我们可以用make命令,而在windows系统中MinGW版的make写作 mingw32-make

  当在我们修改了其中一个源代码文件(pitch.c),重新编译,你会看到make只编译了修改的文件

  使用make工具的目的是快速编译多个源文件程序,如果你写的只是单个源代码文件,那就直接编译来得省事

时间: 2024-10-13 15:22:41

C语言学习013:通过make编译C源代码的相关文章

关于c语言学习 谭浩强的书

2007-11-16 13:22:58|  分类: PROGRAMME |  标签: |举报 |字号大中小 订阅 广大有志于从事IT行业的同志们,在你们进入这一行之前千万请看这篇文章!太经典了!对你绝对有启发! 千万别买谭浩强和等级考试的书!!!!!! 整理别人的言论,请大家踊跃讨论!!!!!!!!!!!! 1:书皮上面有那么多的牛人题词,估计也许是自己的水平太低. 2:ANSI只给了两种方式:int main(void) {/*...*/}和 int main(int argc, char *

【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年本人C语言笔试难点进行梳理,希望能对今年应届毕业生的应聘有所帮助. 2013年10月18日更新-->    攻破C语言这个帖子更新到这里,我不仅仅是为了补充大学学生遗漏的知识,我更重要的是希望通过我的经验,你们实际项目中的C语言写得漂亮,写出属于你的风格.“朱兆祺STM32手记”(http://bb

PHP语言学习之html5的学习,一周总结

通过这周的html5的学习我整理了一下一些东西和一些总结 写代码的时候也开头都要对齐这样开起来很舒服,这些都是用到缩进键搞定的,比如<html></html>在一块写,要前后对齐,这样容易发现错误,而且看起来比较清晰 写代码是还有英文和中文的标点符号的问题,这些都要是注意的,(这基本是我在学习的时候遇到的问题) 要掌握好重要的标签,这样能够更好的学习.... 开始学习html 5 什么是html5HTML是由W3C的维护的 HTML是大小写不敏感的,HTML与html是一样的 HT

Go语言学习笔记(一) : 搭建Windows下的Go开发环境

最近突然对Go语言产生了兴趣,主要是因为在使用python的时候遇到了一些不爽的问题,然后发现了Go.Go是Google出的一个动态语言,语法和C++接近,性能也非常的好,而且还支持编译成exe发布,并且不依赖任何虚拟机(其实是打包在exe里面了),这种好语言怎么能够错过?所以便一时兴起,开始学习了起来.由于本人还处于异常小白的阶段,所以文章中可能不免有些错误,欢迎大家各种指正. 安装Go 前往Go语言的官方网站:http://golang.org/, 下载对应平台的安装包.如果是x86的系统可

我的C语言学习之路——初装Linux(双系统模式)

我的C语言学习之路--初装Linux(双系统模式) 第一次听说Linux是在微软公布不再维护WindowXP系统,当时打开头条网,Linux几乎占据了头条,好奇之下,百度了Linux(Linux操作系统是UNIX操作系统的一种克隆系统,它诞生于1991 年的 [Linux桌面] 10 月5 日(这是第一次正式向外公布的时间)). 第二次听说Linux是在程序员联盟(微信公众号:programmerLeague)   讨论,这也是我真正接触Linux的时候.作为一个编程初学者,对一切有利于编译的软

C语言学习(二)——字符串和格式化输入输出

C语言学习(二)——字符串和格式化输入输出 1.char数组类型和空字符 C没有为字符串定义专门的变量类型,而是把它存储在char数组里.数组的最后一个位置显示字符\0.这个字符就是空字符,C用它来标记字符串的结束,其ASCII码的值为(或者等同于)0.C的字符串存储时通常以这个空字符结束,该字符的存在意味着数组的单元数必须至少比要存储的字符数多1.计算机可以自己处理大多数这些细节问题(例如,scanf( )会添加'\0'使得数组内容成为C字符串). 2.strlen( )函数与sizeof运算

【C语言学习】链接

一个工程由许多的文件组成,当工程中的多个文件编译结束后就需要由链接器将这些模块链接起来成为一个整体的可执行程序.但是,在这个链接过程中,如果出现一些状况的时候就不能将这些模块链接成一个程序.接下来,研究一下这个链接的过程! ★链接多个文件 为了使程序的模块化更强,代码更易于管理,可以将同类型的代码存储在一个文件中.这时,每个文件代表着一类函数的代码,这些代码使用同样的资源,完成同样的操作.这与Java中的类.对象.方法想.很类似.在一个文件中,很可能需要引用另一文件中定义的全局变量或者函数,因此

Smali语言学习了

   最近一周在研究rom移植,所以就对Smali语言学习了一下,Smali语言其实就是Davlik的寄存器语言:Smali语言就是android的应用程序.apk通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件,文件的展示语言. 如图,下面是HelloWorldApp通过apktool反编译出来的目录: Smali文件夹里面的目录, 先打开一个主类HelloWorldAppActivity.smali文件,先来浏览一下里面的语言,在来说说smali的语法

Go语言学习笔记(一) [Go语言的HelloWorld]

日期:2014年7月18日 1.简介 Go 编程语言是一个使得程序员更加有效率的开源项目.Go 是有表达力.简 洁.清晰和有效率的.它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有性的模块化程序.Go 编译到机器码非常快 速,同时具有便利的垃圾回收和强大的运行时反射.它是快速的.静态类型编译语言,但是感觉上是动态类型的,解释型语言. Go 是第一个实现了简单的(或更加简单的)并行开发,且跨平台的类 C 语言. 2.Go语言文档查看 安装好Go语言之后,其文档可以通过go do