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. STM32F103 与 STM32F407引脚兼容问题

    ===========突袭网收集的解决方案如下=========== 解决方案1: STM32F103有的功能407都有,并且这些功能的引脚完全兼容,只是程序不同而已...而STM32F407有的功能 ...

  2. Sublime Text3使用及常用插件

    1.安装packages组件: 参考一: https://sublime.wbond.net/installation 参考二: http://blog.csdn.net/superskk6/arti ...

  3. MVC模式网站编写经验总结

    单个网站使用MVC架构模式经验总结,包含具体网站包分类.包内类的编写.注意事项等方面.本人认为,按照如下包分类及编写方法,已经满足一个简单普通网站(主要针对java)的编写需求. MVC主要层级 数据 ...

  4. PowerShell运行cmd命令

    1.使用.exe扩展名 2.使用 cmd /c "" 3.在 PowerShell v3 中有另一种选择来解决这个问题,只需在命令行的任意位置添加 –% 序列(两个短划线和一个百分 ...

  5. C、Shell、Perl基于Tomcat开发CGI程序环境配置

    基于Tomcat7.0版本号配置CGI开发环境,步聚例如以下: 以我的Tomcat7安装文件夹为例:TOMCA_HOME = /Users/yangxin/Documents/devToos/java ...

  6. careercup-递归和动态规划 9.11

    9.11 给定一个布尔表达式,由0.1.&.|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式得出result值. 解法: 跟其他递归问题一样 ...

  7. 安卓开发中使用Genymotion模拟器

    在安卓开发中,运行和调试自己所写的安卓程序需要用到模拟器 在一般情况下 是直接在这创建一个模拟器,但是这种自带的模拟器运行效率不佳,而且启动时间漫长 所以,我们可以换一款安卓模拟器 Genymotio ...

  8. Java并发——使用Condition线程间通信

    线程间通信 线程之间除了同步互斥,还要考虑通信.在Java5之前我们的通信方式为:wait 和 notify.Condition的优势是支持多路等待,即可以定义多个Condition,每个condit ...

  9. linux下如何删除文件夹

    直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字-r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思删除文件夹实例: rm -rf /var/l ...

  10. laydate JS日期插件

    原文出处 简要介绍 你是时候换一款日期控件了,而layDate非常愿意和您成为工作伙伴.她致力于成为全球最用心的web日期支撑,为国内外所有从事web应用开发的同仁提供力所能及的动力.她基于原生Jav ...