linux学习之C语言(5)------ Makefile详解

对上节简单的例子,通过编写的Makefile,将原来编译时需要4条命令直接减少为一条命令就可以解决,即直接输入make即可,当然了,Makefile的好处并不指的这一点,还有很多好处,下面就对Makefile详细的进行讨论。

  Makefile语法规则:

              targets : prerequistes

              <TAB>    command

         或:

              targets: prerequistes;command
              <TAB>    command            

其中,第一行是依赖关系,第二行是命令,<TAB>代表指的是一个TAB键

           

       eg:
              main:main.o my_fun1.o my_fun2.o
	           gcc -o main main.o my_fun1.o my_fun2.o</span>

表示,目标(targets)的依赖对象是main.o,my_fun1.o,my_fun2.o,当依赖的对象在目标修改后修改的话,就要去执行类似第二个行的命令。

Makefile 有三个非常有用的变量.分别是[email protected],$^,$<代表的意义分别是:[email protected]目标文件,$^--所有的依赖文件,$<--第一个依赖文件.如果我们使用上面三个变量,那么我们可以简化

上节的Makefile。

简化后的Makefile:

main:main.o my_fun1.o my_fun2.o
	gcc -o [email protected] $^
main.o:main.c my_fun1.h my_fun2.h
	gcc -c $<

my_fun1.o:my_fun1.c my_fun1.h
	gcc -c $<

my_fun2.o:my_fun2.c my_fun2.h
	gcc -c $<

还有一个Makefile的缺省规则,

    ..c.o:
         gcc -c $<

这个规则表示所有的 .o 文件都是依赖与相应的.c 文件的

这样,Makefile还可以继续简化,

main:main.o my_fun1.o my_fun2.o
	gcc -o [email protected] $^
..c.o:
	gcc -c $<

时间: 2024-10-14 20:56:23

linux学习之C语言(5)------ Makefile详解的相关文章

Linux学习之/etc/init.d/functions详解

functions这个脚本是给/etc/init.d里边的文件使用的,提供了一些基础的功能,看看里边究竟有些什么.首先会设置umask,path,还有语言环境,然后会设置success,failure,warning,normal几种情况下的字体颜色. 下面再看看提供的重要方法: checkpid:      检查是否已存在pid,如果有一个存在,返回0(通过查看/proc目录) daemon:       启动某个服务./etc/init.d目录部分脚本的start使用到这个 killproc

Linux学习篇之---CentOS Yum命令详解

yum有以下特点: *可以同时配置多个资源库(Repository) *简洁的配置文件(/etc/yum.conf) *自动解决增加或删除rpm包时遇到的倚赖性问题 *使用方便 *保持与RPM数据库的一致性 yum,是Yellow dog Updater Modified的简称,起初是由yellow dog这一发行版的开发者Terra Soft研发,用python写成,那时还叫做yup(yellow dog updater),后经杜克大学的[email protected]开发团队进行改进,遂有

马哥linux学习笔记:htop命令使用详解

htop工具在centos官方yum源仓库中是不提供的,但在epel的yum源仓库中是有的,所以我们可以通过源码编译安装htop,也可以设置epel的yum源来用yum命令安装htop,设置epel的yum源方法为: 首先,下载epel官方网站提供的rpm包,然后安装,就可以设置epel的yum源直接使用了: centos6: wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm centos7:

linux学习基础6之sed用法详解

1 sed 又称为流编辑器,它逐行将文本文件中的行读取到模式空间中间去,将符合编辑条件的行进行编辑后输出到显示器上来.默认sed不编辑原文件只处理模式空间中的内容. 2 sed用法 sed [option]'addresscommand[修饰符]' file 2.1 option -n 采用静默模式,所谓静默模式就是只输出被匹配到的行,不在默认显示模式空间中内容 -i 直接修改原文件 -r 使用扩展的正则表达式 -e 同时连接多个 sed 命令 如sed -e '$a \this is end

【Linux学习】 包含子目录的makefile简单应用

1 .目录结构 practice6 / ui / ui.h   ui.c practice6 / dal / dal.h dal.c practice6 / bll / bll.h  bll.c practice6 / main.c pracitce6 / Makefile 2.Makefile写法及说明 CC = gcc CFLAGS = -Wall -g BIN = main.out SUBDIR = $(shell ls -d */) //调用shell命令 ls -d */ 列出当前目录

Helloworld模块之内核makefile详解

Hello World 模块以及对应的内核makefile详解 hello.c: #include <linux/module.h> //所有模块都需要的头文件 #include <linux/init.h> // init&exit相关宏 MODULE_LICENSE("GPL"); MODULE_AUTHOR("feifei"); MODULE_DESCRIPTION("hello world module")

Linux内核模块编程与内核模块LICENSE -《详解(第3版)》预读

Linux内核模块简介 Linux内核的整体结构已经非常庞大,而其包含的组件也非常多.我们怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核.这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核. 有没有一种机制使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中呢?Linux提供了这样的一种机制,这种机制被称为模块(Module).模块具有这样的特点. 模块本

学习笔记——Maven settings.xml 配置详解

文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${user.home} 和和所有其他系统属性只能在3.0+版本上使用.请注意windows和Linux使用变量的区别. settings.xml详解 声明规范 <?xml version="1.0" encoding="UTF-8"?> <settings x

Swift语言的基础详解

1.1.关于swift · Swift 是一种适用于 iOS 和 OS X 应用的全新编程语言,它建立在最好的 C 和 Objective-C 语言之上,并且没有 C 语言的兼容性限制.Swift 采用安全的编程模式,增加了现代功能使 编程更容易.更灵活.更有趣.Swift 以成熟且备受宠爱的 Cocoa 和 Cocoa Touch 框架为 支撑,这是一个重新构想软件开发的机会. · 支持Playground,它允许程序实时预览,无需频繁创建和运行APP · 简洁, 安全, 容易, 灵活, 高效

Linux(centos)系统各个目录的作用详解

Linux(centos)系统各个目录的作用详解 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等,可用cat.less.more.vi.emacs来察看内容,用mv来改名. 目录文件:包括文件名.子目录名及其指针.它是LINUX储存文件名的唯一地方,可用ls列出目录文件. 连接文件:是指向同一索引节点的那些目录条目.用ls来查看是,连接文件的标志用l开头,