Gcc的编译流程
预处理阶段: gcc –E hello.c –o hello.i
编译阶段: gcc –S hello.i –o hello.s
汇编阶段:gcc –c hello.s –o hello.o
链接阶段:gcc hello.o –o hello
执行:./hello

GCC的选项 
GCC 有超过100个的编译选项可用. 主要包括编译处理选项、警告选项、出错选项、优化选项、体系结构选项。
 -c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译. GCC 产生的汇编语言文件的缺省扩展名是 .s .

-g,产生符号调试工具(GNU的gdb)所必要的符号信息,要想对源代码进行调试,我们就必须加入这个选项。
-O,对程序进行优化编译、连接,产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

简单的makefile文件如下

start: hello.o                                                 //标号:依赖项
[tab键]  gcc -o hello hello.o                             //只会执行这一句除非需要依赖关系才会执行依赖标号的
     @echo "------------------ok----------------"   //@的意思是输出的时候不会输出echo
 hello.o:
[tab键]   gcc -o hello.o -c hello.c
 clean:
[tab键]   rm -rf hello.o

makefile中也可以有变量一般变量都用大写如:VARNAME=some_text

引用变量$(VARNAME)

如:

AA=gcc

start: hello.o                                                 //标号:依赖项
[tab键]  $(AA)-o hello hello.o                             //只会执行这一句除非需要依赖关系才会执行依赖标号的
     @echo "------------------ok----------------"   //@的意思是输出的时候不会输出echo
 hello.o:
[tab键]  $(AA)-o hello.o -c hello.c
 clean:
[tab键]   rm -rf hello.o

以后换编译器就只需要改变AA的值就可以啦。。

再次简化

AA=gcc

SRCS=hello.c

OBJS=hello.o     #还可以这样写:OBJS=$(SRCS:.c=.o)

EXEC=hello

start: $(OBJS)                                                  //标号:依赖项
        $(AA)-o $(EXEC) $(OBJS)                             //只会执行这一句除非需要依赖关系才会执行依赖标号的
     @echo "------------------ok----------------"   //@的意思是输出的时候不会输出echo
$(OBJS)  :
        $(AA)-o $(OBJS) -c $(SRCS)
 clean:
     rm -rf $(OBJS)

////////////////

还有如下:

.SUFFIXES: .c .o        #这是一种规则表示x.c文件与x.o文件关联

SRCS=hello.c
 OBJS=$(SRCS:.c=.o)
 EXES=hello
 CC=gcc

start: $(OBJS)
   $(CC) -o $(EXES) $(OBJS)
   @echo "------------------ok----------------"
 .c.o:                                                                   #关联项
   $(CC) -o $@ -c $<                                        #  $@ 表示规则对应的目标文件 hello.o  $<  表示规则关联的文件hello.c
 clean:
   rm -rf $(OBJS)

、、、、、、、、、、、、、、、、、、、、、、、、、、、、

/////////////////makefile同时编译多个文件

.SUFFIXES: .c .o        #这是一种规则表示x.c文件与x.o文件关联

SRCS=hello.c\add.c               #在这里同时编译2个文件
 OBJS=$(SRCS:.c=.o)
 EXES=hello
 CC=gcc

start: $(OBJS)
   $(CC) -o $(EXES) $(OBJS)
   @echo "------------------ok----------------"
 .c.o:                                                                   #关联项
   $(CC) -o $@ -c $<                                        #自动根据$(OBJS)中.o的数量循环编译,直到编译完所有的.c文件
 clean:
   rm -rf $(OBJS)

make makefile的更多相关文章

  1. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  2. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  3. 编写简单的Makefile文件

    makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c  x.h 表示生成www这个文件需 ...

  4. 简单编写Makefile

    相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide.其实makefile并没有 ...

  5. [转]Linux中configure/makefile

    本文教你如何使用autoconf.automake等来制作一个以源代码形式(.tar.gz)发布的软件.并可在执行configure时使用自定义参数. 一.概述和基础知识 在Linux下得到一个以源代 ...

  6. Linux内核配置、编译及Makefile简述

    Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核. ...

  7. make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”

    默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...

  8. 实例:对2个Makefile的备注

    实例1:Makefile编译链接简单.c函数 example.c Makefile exe: example.c gcc example.c -o exe clean: rm exe 执行效果: 实例 ...

  9. Linux中C程序调试、makefile

    gcc基本语法格式:gcc [-选项] 源文件 [-选项] 目标文件,GCC编译C程序的过程: 预处理:gcc -E hello.c hello.i.-E指定执行到预处理结束,下面类似. 编译:gcc ...

  10. Linux工具入门:make工具与Makefile文件

    1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...

随机推荐

  1. 383. Container With Most Water

    最后更新 一刷. 双指针夹逼. 容器的高度受限于较小的边,夹的时候底在变小,所以移动较大的边没有意义,最终高度还是小的那边:只能尝试移动小的那个边. public class Solution { p ...

  2. MSSQLSERVER数据库- 获取月份的第一天和最后一天

    本月第一天:select dateadd(dd,-day(getdate())+1,getdate()) 本月最后一天:select dateadd(dd,-day(getdate()),datead ...

  3. Android解析Json速度最快的库:json-smart

    场景描写叙述: 本文仅验证了在安卓环境下使用Json的Key作为反序列化条件的解析速度.结论是解析速度最快的不是阿里的fastjson,也不是Google的Gson,而是json-smart. And ...

  4. crm操作权限

    using System;     using Microsoft.Xrm.Sdk;     using Microsoft.Xrm.Sdk.Query;     using System.Colle ...

  5. Android将应用log信息保存文件

    相信大家在做应用调试的时候,不可能时时通过USB线连着电脑去查看log信息,所以,将应用的log信息保存到手机本地就很有必要了,有助我们从这些log信息中提取有用的部分,以解决一些bug,下面我把网上 ...

  6. android113 自定义进度条

    MainActivity: package com.itheima.monitor; import android.os.Bundle; import android.app.Activity; im ...

  7. [转] 引用 Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用

    PS: Spring ThreadPoolTaskExecutor vs Java Executorservice cachedthreadpool 引用 [轰隆隆] 的 Java自带的线程池Thre ...

  8. modelsim脚本文件的编写

    第一章 ModelSim介 绍 本指南是为 ModelSim5.5f版本编写的,该版本运行于UNIX和Microsoft Windows 95/98/Me/NT/2000的操作系统环境中.本指南覆盖了 ...

  9. ThinkPHP函数详解:R方法

    R方法用于调用某个控制器的操作方法,是A方法的进一步增强和补充.关于A方法的用法见这里.R方法的调用格式:R('[项目://][分组/]模块/操作','参数','控制器层名称') 例如,我们定义了一个 ...

  10. xml_03

    1.xml 2.对于XML文档的约束   |-DTD      <!DOCTYPE 根元素 [       <!ELEMENT 元素名 (xx)>       <!ATTLIS ...