《笨办法学C》笔记之Makefile
使用gcc编译C语言源码
在Linux系统中,C语言源码需要用gcc编译为二进制可执行文件,才能够运行。
$ gcc test.c -o test
这句命令就将test.c文件编译为test二进制可执行文件。
$ ./test
如此可以直接执行编译后的test二进制可执行文件。
如何编译多个.c文件
例1 需要将test1.c、test2.c、test3.c合并编译为一个test可执行文件。
一种办法是:
$ gcc test1.c test2.c test3.c -o test
这个办法的缺陷是,每次会将所有.c文件编译一次。如果下次编译时,只有test3.c文件发生变动,那么重复编译test1.c和test2.c文件显得有些多余。
另一个办法则是:
$ gcc -c test1.c
$ gcc -c test2.c
$ gcc -c test3.c
$ gcc -c test test1.o test2.o test3.o
gcc使用-c选项,可以将.c文件编译为.o对象文件。对象文件是gcc将源码编译为二进制文件的中间结果,省去了最后的链接阶段。
最后一行命令里,gcc将各个.o对象文件组合链接为完整的二进制可执行文件。
如果能够做到:
在编译.o文件之前检查对应的.c文件的最后修改日期是否在.o文件的生成日期之后,如果是,才会再次编译
那整个编译过程会大大减少耗时。
而Make系统就可以做到这一点。
Makefile
例2 考虑一个小型的C语言项目:
tmp/
+---- include/
| +---- f1.h
| +----f2.h
+----f1.c #include "include/f1.h"
+----f2.c #include"include/f2.h"
+---main.c #include"include/f1.h", #include"include/f2.h"
对应makefile如下所示:
#Makefile,Create testmf from f1.c f2.c main.c
all: main.o f1.o f2.o
gcc -o testmf main.o f1.o f2.o
f1.o: f1.c
gcc -c -o file1.o file1.c
f2.o: f2.c
gcc -c -o file2.o file2.c
main.o
gcc -c -o main.o main.c
clean:
rm -rf f1.o f2.o main.o testmf
如果在tmp目录下直接执行make all,那么make系统首先会搜索all标签,并执行其对应的命令:gcc -o testmf main.o f1.o f2.o。接着,make会去递归查找这一命令对应的参数文件main.o、f1.o、f2.o:
- 如果文件不存在,直接执行对应的编译命令;
- 如果存在但对应.c文件已经更新,仍然会执行对应的编译命令;
- 如果存在而已经是最新,那么就会直接调用编译好的.o对象文件。
回过头来考虑例1——如果下次编译时,只有test3.c文件发生变动,如果调用makefile,那么整个过程仅仅会执行gcc -c test3.c和gcc -c test test1.o test2.o test3.o两个命令。
其他
- 调用make命令后,系统会搜索Makefile或者makefile文件;也可以使用
make -f指定自定义文件名。 - 其实make后面的参数就是个makefile里的标签,至于标签里的填的是什么并不重要。把第一行的
all改成main,那么执行make main就和原先的make all是同样的效果。 - 可以使用
$()来表示变量,方便构建复杂的makefile。
参考资料
延伸阅读
《笨办法学C》笔记之Makefile的更多相关文章
- 笨办法学 Python (Learn Python The Hard Way)
最近在看:笨办法学 Python (Learn Python The Hard Way) Contents: 译者前言 前言:笨办法更简单 习题 0: 准备工作 习题 1: 第一个程序 习题 2: 注 ...
- 笨办法学 Python (第三版)(转载)
笨办法学 Python (第三版) 原文地址:http://blog.sina.com.cn/s/blog_72b8298001019xg8.html 摘自https://learn-python ...
- 笨办法学Python - 习题1: A Good First Program
在windows上安装完Python环境后,开始按照<笨办法学Python>书上介绍的章节进行练习. 习题 1: 第一个程序 第一天主要是介绍了Python中输出函数print的使用方法, ...
- [IT学习]Learn Python the Hard Way (Using Python 3)笨办法学Python3版本
黑客余弦先生在知道创宇的知道创宇研发技能表v3.1中提到了入门Python的一本好书<Learn Python the Hard Way(英文版链接)>.其中的代码全部是2.7版本. 如果 ...
- 笨办法学python 13题:pycharm 运行
笨办法学python 13题 代码: # -*- coding: utf-8 -*- from sys import argv # argv--argument variable 参数变量 scrip ...
- 笨办法学python - 专业程序员的养成完整版PDF免费下载_百度云盘
笨办法学python - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:xaln 怎样阅读本书 由于本书结构独特,你必须在学习时遵守几条规则 录入所有代码,禁止复制粘贴 一字不差地录入代码 ...
- 笨办法学Python 3|百度网盘免费下载|新手基础入门书籍
点击下方即可百度网盘免费提取 百度网盘免费下载:笨办法学Python 3 提取码:to27 内容简介: 本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用. ...
- 《笨办法学 Python(第四版)》高清PDF|百度网盘免费下载|Python编程
<笨办法学 Python(第四版)>高清PDF|百度网盘免费下载|Python编程 提取码:jcl8 笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机 ...
- 笨办法学python 第四版 中文pdf高清版|网盘下载内附提取码
笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机了解不多,没有学过编程,但对编程感兴趣的朋友学习使用.这本书以习题的方式引导读者一步一步学习编 程,从简单的打印一 ...
- 《笨办法学Python 3》python入门书籍推荐|附下载方式
<笨办法学Python 3>python入门书籍免费下载 内容简介 本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用.这本书以习题的方式引导读 ...
随机推荐
- SSDP
SSDP:Simple Service Discover Protocol,简单服务发现协议,PC机只要网口UP,就会通过该协议寻找可用的网络服务.PC机发出的报文基于UDP协议的1900端口发送组播 ...
- AJAX实现跨域的三种种方法(代理,JSONP,XHR2)
由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问. 比如说你的网站域名是aaa.com,想要通过AJAX请 ...
- PHP集成百度Ueditor 1.4.3
下载安装 1.首先到官网下载最新版的UE1.4.3UE官方下载地址:http://ueditor.baidu.com/website/download.html#ueditor 这里我下载的是1.4. ...
- Centos安装lnmp环境
1:查看环境: [root@10-4-14-168 html]# cat /etc/redhat-release CentOS release 6.5 (Final) 2:关掉防火墙 [root@10 ...
- HDOJ(1238) KMP
Substrings http://acm.hdu.edu.cn/showproblem.php?pid=1238 先找到长度最短的字符串,把它的子串和该子串的逆序(按长度从大到小)依次与其他字符串匹 ...
- LNMP添加、删除虚拟主机及伪静态使用教程
一般情况下每个虚拟主机就是一个网站,网站一般通过域名进行访问.LNMP 1.2的网站添加过程和LNMP 1.1的基本类似,但是增加了FTP和数据库的创建.LNMP1.2的防跨目录也由原来在php.in ...
- Android_SQLite之创建数据库
今天我们主要学习了SQLite.主要是其中的创建数据库,连接这块. 现在我们先简单讲解下什么是SQLite 一.SQLite 简介 Google为Andriod的较大的数据处理提供了SQLite, 他 ...
- Calendar /String /Date 转换
Calendar 转化 String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDate ...
- asp.net LINQ LinqDataSource控件显示数据和DropdownList显示数据
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序
本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...