使用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.cgcc -c test test1.o test2.o test3.o两个命令。

其他

  1. 调用make命令后,系统会搜索Makefile或者makefile文件;也可以使用make -f指定自定义文件名。
  2. 其实make后面的参数就是个makefile里的标签,至于标签里的填的是什么并不重要。把第一行的all改成main,那么执行make main就和原先的make all是同样的效果。
  3. 可以使用$()来表示变量,方便构建复杂的makefile

参考资料

延伸阅读

《笨办法学C》笔记之Makefile的更多相关文章

  1. 笨办法学 Python (Learn Python The Hard Way)

    最近在看:笨办法学 Python (Learn Python The Hard Way) Contents: 译者前言 前言:笨办法更简单 习题 0: 准备工作 习题 1: 第一个程序 习题 2: 注 ...

  2. 笨办法学 Python (第三版)(转载)

    笨办法学 Python (第三版) 原文地址:http://blog.sina.com.cn/s/blog_72b8298001019xg8.html   摘自https://learn-python ...

  3. 笨办法学Python - 习题1: A Good First Program

    在windows上安装完Python环境后,开始按照<笨办法学Python>书上介绍的章节进行练习. 习题 1: 第一个程序 第一天主要是介绍了Python中输出函数print的使用方法, ...

  4. [IT学习]Learn Python the Hard Way (Using Python 3)笨办法学Python3版本

    黑客余弦先生在知道创宇的知道创宇研发技能表v3.1中提到了入门Python的一本好书<Learn Python the Hard Way(英文版链接)>.其中的代码全部是2.7版本. 如果 ...

  5. 笨办法学python 13题:pycharm 运行

    笨办法学python 13题 代码: # -*- coding: utf-8 -*- from sys import argv # argv--argument variable 参数变量 scrip ...

  6. 笨办法学python - 专业程序员的养成完整版PDF免费下载_百度云盘

    笨办法学python - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:xaln  怎样阅读本书 由于本书结构独特,你必须在学习时遵守几条规则 录入所有代码,禁止复制粘贴 一字不差地录入代码 ...

  7. 笨办法学Python 3|百度网盘免费下载|新手基础入门书籍

    点击下方即可百度网盘免费提取 百度网盘免费下载:笨办法学Python 3 提取码:to27 内容简介: 本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用. ...

  8. 《笨办法学 Python(第四版)》高清PDF|百度网盘免费下载|Python编程

    <笨办法学 Python(第四版)>高清PDF|百度网盘免费下载|Python编程 提取码:jcl8 笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机 ...

  9. 笨办法学python 第四版 中文pdf高清版|网盘下载内附提取码

    笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机了解不多,没有学过编程,但对编程感兴趣的朋友学习使用.这本书以习题的方式引导读者一步一步学习编 程,从简单的打印一 ...

  10. 《笨办法学Python 3》python入门书籍推荐|附下载方式

    <笨办法学Python 3>python入门书籍免费下载 内容简介 本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用.这本书以习题的方式引导读 ...

随机推荐

  1. NTFS u盘支持 - centos6

    uname -r bash-4.1# uname -r2.6.32-431.el6.x86_64 ---- http://repository.it4i.cz/mirrors/repoforge/re ...

  2. sql 查出一张表中重复的所有记录数据

    1.在面试的时候碰到一个 问题,就是让写一张表中有id和name 两个字段,查询出name重复的所有数据,现在列下: select * from xi a where (a.username) in ...

  3. cocos2d-js去掉左下角的三行数字(帧数)

    project.json 里面"showFPS": true, 改成 false 就行了... 调整帧率也在这里调整 或者是 同cocos2dx,cocos2d-js左下角的FPS ...

  4. xargs的原理剖析及用法详解

    转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/5925923.html 学习这个xargs花了很长时间,在网上翻了很久也查了很多书关于xargs的介绍,都只 ...

  5. SQL Server 数据库的维护(一)__存储过程(procedure)

    --维护数据库-- --存储过程(procedure)-- --概述: SQl Serve的存储过程是由一个或多个T-SQL语句组成的一个集合.常用的程序代码段通常被创建成存储过程,一次创建多次调用, ...

  6. egrep 及扩展正则表达式

    grep -E 表示支持扩展的正则表达式 grep -E = egrep 一.字符匹配: 扩展模式下的字符匹配与基本正则表达式的字符匹配相同,如: . 表示任意单个字符 [] 表示范围内人任意单个字符 ...

  7. java图形界面写个小桌面,内置简单小软件

    一.做个这样的效果,双击图标打开相应的应用 二.主界面类,使用JavaSwing的JDesktopPane类创建这个桌面 package com.swing; import java.awt.Bord ...

  8. 位段(bitfield)

    struct { unsigned int fieldA        :       4 ; unsigned int fieldB        :       2 ; unsigned int ...

  9. IOS系列swift语言之课时八

    这节课需要讲的就是可选链,内存管理,引用计数,unowned解决 //: Playground - noun: a place where people can play import UIKit / ...

  10. 初学c# -- 学习笔记(六) winfrom组件圆角

    刚好用到这个功能,看了好些例子.我就不明白,简单的一个事,一些文章里的代码写的那个长啊,还让人看么. 精简后,就其实一点,只要有paint事件的组件,都可画圆角,没有的外面套一个panel就行了. u ...