使用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. 最全面的 C++ 资源、框架大全

    转载自   http://www.codeceo.com/article/cpp-resource-framework.html#0-tsina-1-99850-397232819ff9a47a7b7 ...

  2. mybatis单个插入和批量插入的简单比较

    在J2EE项目中,mybatis作为主流持久层框架,许多知识值得我们去钻研学习,今天,记录一下数据插入性能(单个插入和批量插入). 一,测试对象 public class Test { private ...

  3. KBMMW 4.93.10 win64 一个BUG 修正

    经常有人提到kbmmw 4.93.10 的64 位版本没有32位版本稳定. 经过官方确认,是delphi 编译器生成64 位代码内存偏移地址的错误. 在kbmMWGlobal.pas 中 有一个函数k ...

  4. Apache 的ab压力测试工具

    ab.exe -n 请求次数 -c 并发人数

  5. 深入浅出讲解:php的socket通信

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问:1.         什么是TCP/IP.UDP?2.         Socke ...

  6. 重走java--Step 3

    java基础(三)之枚举用法用法一:常量 public enum Color {    RED,GREEN,RED,YELLOW;}用法二:枚举中自定义方法/** * 枚举中自定义方法 */publi ...

  7. .net 下载文件几种方式

    方式一:TransmitFile实现下载.将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件. protected void Button1_Click(object sender, ...

  8. easyui combobox点击输入框弹出下拉框

    由于easyui combobox需要点击下拉箭头才能下拉,不能像select标签那样点击输入框就下拉,所以觉得不太方便,查看了一下,combobox弹出框是一个div,原本想在他的输入框的点击事件中 ...

  9. WPF的"路径标记语法"

    在此之前我们先了解一下WPF的"路径标记语法" M:表示绘制起点 // M 0,0 L:表示绘制直线 (H:横线 V:竖线)  // L 100,0 C:三次方贝塞尔曲线   // ...

  10. 深入理解js——作用域和上下文环境

    如图除全局作用域外,每个函数都会创建自己的作用域.作用域在函数定义时就确定了,而不是在函数调用时确定. 下面按照程序执行的步骤加上上下文环境. 第一步:程序加载时已经确定全局上下文环境,并随着程序的执 ...