`

MakeFile gcc 用 make 进行巨集编译

阅读更多
(MAKE)makefile中7个核心自动变量
$@ :工作目标文件名
 
$% :档案文件成员结构中的文件名元素
 
$< :第一个必要条件的文件名
 
$? :时间戳在工作目标(的时间戳)之后的所有必要条件,并以空格隔开这些必要条件
 
$^ :所有必要条件的文件名,并以空格隔开这些文件名。这份列表已删掉重复的文件名,因为对大多数的应用而言,比如编译、复制等,并不会用到重复的文件名。
 
$+ :如同$^,代表所有必要条件的文件名,并以空格隔开这些文件名。不过,这个包含重复的文件名。此变量会在特殊的状况下被创建,比如将自变量传递给连接器时重复是有意义的。
 
$* :工作目标的主文件名。一个文件名称是由两部分组成:主文件名和扩展名。
用 make 进行巨集编译
用 make 进行巨集编译
为什么要用 make
main.c :主要的目的是让使用者输入角度资料与呼叫其他三支副程式;
haha.c :输出一堆有的没有的讯息而已;
sin_value.c :计算使用者输入的角度(360) sin 数值;
cos_value.c :计算使用者输入的角度(360) cos 数值。
# 1. 先进行目标档的编译,最终会有四个 *.o 的档名出现:
[root@www ~]#
gcc -c main.c
[root@www ~]# gcc -c haha.c
[root@www ~]# gcc -c sin_value.c
[root@www ~]# gcc -c cos_value.c


# 2. 再进行连结成为执行档,并加入 libm 的数学函式,以产生 main 执行档:
[root@www ~]#
gcc -o main main.o haha.o sin_value.o cos_value.o \
> -lm -L/usr/lib -L/lib

# 3. 本程式的执行结果,必须输入姓名、360 度角的角度值来计算:
[root@www ~]#
./main
Please input your name: tom <==这里先输入名字
Please enter the degree angle (ex> 90): 30 <==输入以 360 度角为主的角度
Hi, Dear tom, nice to meet you. <==这三行为输出的结果喔!
The Sin is: 0.50
The Cos is: 0.87

编译的过程需要进行好多动作啊!而且如果要重新编译,则上述的流程得要重新来一遍,光是找出这些指令就够烦人的了! 如果可以的话,能不能一个步骤就给他完成上面所有的动作呢?那就利用 make 这个工具吧!

先试看看在这个目录下建立一个名为 makefile 的档案,内容如下:
# 1. 先编辑 makefile 这个规则档,内容只要作出 main 这个执行档
[root@www ~]#
vim makefile
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
# 注意:第二行的 gcc 之前是 按键产生的空格喔!

# 2. 尝试使用 makefile 制订的规则进行编译的行为:
[root@www ~]#
rm -f main *.o
<==先将之前的目标档去除
[root@www ~]#
make
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o sin_value.o sin_value.c
cc -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
# 此时 make 会去读取 makefile 的内容,并根据内容直接去给他编译相关的档案啰!

# 3. 在不删除任何档案的情况下,重新执行一次编译的动作:
[root@www ~]#
make
make: `main' is up to date.
# 看到了吧!是否很方便呢!只会进行更新 (update) 的动作而已。

make 有这些好处:
简化编译时所需要下达的指令;
若在编译完成之后,修改了某个原始码档案,则 make 仅会针对被修改了的档案进行编译,其他的 object file 不会被更动;
最后可以依照相依性来更新 (update) 执行档。

makefile 的基本语法与变数
基本的 makefile 规则
是这样的:
标的(target): 目标档1 目标档2
gcc -o 欲建立的执行档 目标档1 目标档2
那个标的 (target) 就是我们想要建立的资讯,而目标档就是具有相关性的 object files ,那建立执行档的语法就是以 按键开头的那一行!特别给他留意喔,‘命令列必须要以 tab 按键作为开头’才行!他的规则基本上是这样的:
在 makefile 当中的 # 代表注解;
需要在命令行 (例如 gcc 这个编译器指令) 的第一个字元;
标的 (target) 与相依档案(就是目标档)之间需以‘:’隔开。
我们以刚刚上一个小节的范例进一步说明,
如果我想要有两个以上的执行动作
时, 例如下达一个指令就直接清除掉所有的目标档与执行档,该如何制作呢?
# 1. 先编辑 makefile 来建立新的规则,此规则的标的名称为 clean :
[root@www ~]#
vi makefile
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
# 2. 以新的标的 (clean) 测试看看执行 make 的结果:
[root@www ~]#
make clean
<==就是这里!透过 make 以 clean 为标的
rm -rf main main.o haha.o sin_value.o cos_value.o

如此一来,我们的 makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要建立 main 的话,输入‘make main’,如果想要清除有的没的,输入‘make clean’即可啊!而如果想要先清除目标档再编译 main 这个程式的话,就可以这样输入:‘make clean main’,如下所示:
[root@www ~]#
make clean main
rm -rf main main.o haha.o sin_value.o cos_value.o
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o sin_value.o sin_value.c
cc -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
这样就很清楚了吧!但是,你是否会觉得,咦! makefile 里面怎么重复的资料这么多啊!没错!所以我们可以再藉由 shell script 那时学到的‘变数’来更简化 makefile 喔:
[root@www ~]#
vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}

与 bash shell script 的语法有点不太相同,变数的基本语法为:
变数与变数内容以‘=’隔开,同时两边可以具有空格;
变数左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
变数与变数内容在‘=’两边不能具有‘:’;
在习惯上,变数最好是以‘大写字母’为主;
运用变数时,以 ${变数} 或 $(变数) 使用;
在该 shell 的环境变数是可以被套用的,例如提到的 CFLAGS 这个变数!
在指令列模式也可以给予变数。
由于 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变数,所以,你可以直接在 shell 定义出这个环境变数,也可以在 makefile 档案里面去定义,更可以在指令列当中给予这个咚咚呢!例如:
[root@www ~]#
CFLAGS="-Wall" make clean main
# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变数内容!
也可以这样:
[root@www ~]#
vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}

咦!我可以利用指令列进行环境变数的输入,也可以在档案内直接指定环境变数,那万一这个 CFLAGS 的内容在指令列与 makefile 里面并不相同时,以那个方式输入的为主?呵呵!问了个好问题啊! 环境变数取用的规则是这样的:
make 指令列后面加上的环境变数为优先;
makefile 里面指定的环境变数第二;
shell 原本具有的环境变数第三。
此外,还有一些特殊的变数需要了解的喔:

$@:代表目前的标的(target)
所以我也可以将 makefile 改成:
[root@www ~]#
vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS}
<==那个 $@ 就是 main !
clean:
rm -f main ${OBJS}
这样是否稍微了解了 makefile (也可能是 Makefile) 的基本语法
分享到:
评论

相关推荐

    Makefile不编译已经编译过的文件

    总结起来,`Makefile`不编译已经编译过的文件是通过检查文件的修改时间来决定是否需要重新编译的,这是`make`工具的一个强大功能,能够显著提升大型项目构建的效率。理解并熟练运用`Makefile`的规则和特性,对于任何...

    gcc.rar_gcc makefile_gcc 使用_makefile_makefile gcc_makefile in en

    7. **Makefile的执行**:运行`make`命令,它会根据目标和依赖自动执行相应的编译任务。 这个资源集合对学习和使用GCC及makefile非常有帮助,无论是初学者还是经验丰富的开发者,都能从中受益。通过深入理解和实践,...

    makefile 和gcc手册

    在进行Linux编程时,`Makefile`与`gcc`的结合使用能极大提高开发效率。开发者可以根据项目需求定制`Makefile`,设置特定的编译选项、编译规则以及清理命令。通过运行`make`命令,`Makefile`会智能地检测源文件的变化...

    gcc 和makefile 详解

    GNU Make 的主要工作是读进一个文本文件, makefile 。这个文件里主要是有关哪些文件 (‘target’目的文件)是从哪些别的 文件(‘dependencies’依靠文件)中产 生的,用什么命令 来进行 这个产生过程。 gcc/g++...

    center os7 安装gcc/make所需要的rpm包

    GCC是一套用于编译C、C++、Fortran、Objective-C等编程语言的编译器,而Make则是一个自动化构建工具,用于协调编译过程中的依赖关系,确保程序按照正确的顺序编译和链接。在CentOS 7操作系统中,我们通常使用RPM...

    gcc make makefile cmake cmakelist 区别

    GCC、make、Makefile、CMake和CMakeLists.txt是软件开发中常用的工具和文件,它们各自扮演着不同的角色,帮助开发者高效地进行编译、构建和管理项目。下面详细地介绍这些知识点。 首先,GCC是GNU Compiler ...

    makefile and gcc

    1. 预处理:GCC首先进行预处理,处理宏定义、条件编译指令和包含的头文件,生成.i文件。 2. 编译:预处理后的.i文件通过编译器转化为汇编代码(.s文件)。 3. 汇编:汇编器将汇编代码转换为机器代码(.o目标文件)...

    GCC开发STM32程序源码(附makefile,编译下载通过)

    调试通过的GCC开发stm32程序源码,使用官方3.5函数库。示例工程是一个简单的流水灯程序。附本工程的makefile...在搭建好的环境下,直接make一下,就能编译整个工程。环境和搭建的方法参见博客GCC开发stm32入门文章。

    gcc g++ tcl make ubuntu安装编译环境

    在Ubuntu操作系统中,GCC(GNU Compiler Collection)和G++是两个非常重要的编译工具,用于C和C++编程语言的源代码编译。GCC不仅支持C和C++,还支持Fortran、Ada、Go等多种编程语言。G++是GCC的一部分,专门处理C++...

    实验三 Linux环境编程及GCC、Make

    `make`命令根据Makefile中的规则执行编译任务。实验中,学生应学习如何编写Makefile,以便有效地管理大型程序的编译过程。 4. **文件描述符和文件管理**: 在Linux中,每个打开的文件都有一个文件描述符,它是进程...

    GCC和MakeFile入门代码一

    总结一下,GCC和Makefile是软件开发中的基础工具,GCC负责将源代码编译成可执行程序,而Makefile则提供了自动化构建和管理项目的方法。通过学习和掌握这两个工具,开发者可以提高代码的构建效率,减少手动操作的错误...

    AVR-GCC Makefile 中文翻译

    ### AVR-GCC Makefile中文翻译解析 #### 一、引言与背景介绍 在深入了解AVR-GCC Makefile中文翻译之前,我们首先应当对AVR单片机、AVR-GCC以及Makefile这三个核心概念有一个基本的认识。AVR单片机是一种基于精简...

    MAKEFILE 一键编译所有源程序

    这个项目可能包括多个C源文件,使用 `Makefile` 进行编译和管理。要使用这个 `Makefile`,用户需要解压 `nxlimNEW`,然后在终端中运行 `make` 命令,即可实现一键编译整个项目。同时,通过运行 `make clean` 可以...

    linux离线安装gcc、make、build-essential、Realtek8125b网卡驱动.zip

    4. **编译和安装GCC**:进入GCC源码目录,运行`./configure`进行配置,然后执行`make`和`make install`进行编译和安装。 5. **安装make**:类似地,对make执行相同的编译和安装过程。 6. **安装build-essential**...

    makefile & GCC & GDB.rar

    在Linux平台上进行C++开发,`makefile`、`GCC`和`GDB`是三个至关重要的工具。本文将深入探讨这些工具的概念、用途以及如何有效地利用它们。 首先,我们来了解一下`makefile`。`makefile`是构建程序的重要组成部分,...

    Linux网络操作系统项目教程项目9使用gcc和make调试程序.pdf

    知识点3:掌握使用make编译的方法 make是一个自动构建工具,可以自动编译和链接程序。makefile是make的配置文件,用于定义编译规则和依赖关系。在使用make进行编译时,开发者需要编写makefile文件,并使用make命令来...

    全面学习make工具,学写makefile,gcc全部的选项详解

    `make`工具和`makefile`是C/C++开发中的核心组件,它们帮助我们自动化构建过程,而`gcc`作为常用的C/C++编译器,其丰富的选项则提供了多种控制编译行为的方式。下面将深入探讨这些主题。 1. **make工具**:`make`是...

    gcc、make、build-essential、r8125离线安装包及依赖

    在Ubuntu系统中,进行软件开发或者驱动安装时,常常会用到`gcc`、`make`、`build-essential`等工具,特别是对于Realtek网卡的驱动安装,`r8125`离线安装包及其依赖是必不可少的。下面将详细解释这些组件的作用、安装...

    Makefile和gcc培训材料

    通过学习这些材料,开发者可以更有效地管理项目构建,理解编译过程,并能熟练运用Makefile和GCC进行项目开发,提高工作效率。在华为这样的大型企业中,掌握这些技能对于团队协作和项目维护至关重要。

    gcc_makefile

    GCC Makefile的工作流程主要分为两部分:内部编译流程和安装流程。这里主要关注内部编译流程。 1. **内部编译流程**(`all.internal`) - **宏定义**:定义了一系列变量和宏,用于控制构建过程。 - **检查...

Global site tag (gtag.js) - Google Analytics