【Makefile学习笔记】

1相关概念

Makefile 是啥

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
[百度百科https://baike.baidu.com/item/Makefile/4619787]

Make与Makefile的关系

make 是一个命令工具,它解释Makefile中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。

Makefile 命名规则

Makefile 或makefile,一般使用Makefile

Cmake 又是啥

CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile 或者project文件,能测试编译器所支持的C++特性,类似 UNIX下的automake。只是CMake 的组态档取名为CMakeLists.txt。Cmake并不直接建构出最终的软件,而是产生标准的建构档(如 Unix的 Makefile 或Windows Visual C++的projects/workspaces),然后再依一般的建构方式使用【百度百科 https://baike.baidu.com/item/cmake]

Cmake 与CMakeLists的关系

cmake 是一个命令工具,可用来生成makefile。但也要根据CMakeLists.txt中的内容来生成,CMakeLists.txt就是写给cmake 的规则。
这篇【Makefile和CMakeList的简介与使用 - CSDN App】介绍的比较详细。

重点

make 是一个命令工具,Makefile是一个文件,make执行的时候,去读取Makefile文件中的规则,重点是makefile 得自己写。

cmake 是一个命令工具,CMakeLists.txt是一个文件,cmake执行的时候,去读取CMakeLists.txt文件中的规则,生成makefile,重点是CMakeLists.txt得自己写。

2 从 hello world 开始

Makefile 基本语法

目标:依赖 Tab命令
目标:一般是指要编译的目标,也可以是一个动作
依赖:指执行当前目标所要依赖的先项,包括其它目标,某个具体文件或库等
一个目标可以有多个依赖
命令:该目标下要执行的具体命令,可以没有,也可以有多条.多条时,每条命令一行

make 常用选项

make [-f file] [options] [target]

Make 默认在当前目录中寻找GUNmakefile,makefile,Makefile的文件作为 make的输入文件
-f 可以指定除上述文件名之外的文件作为输入文件
-v 显示版本号
-n 只输出命令,但并不执行,一般用来测试
-s 只执行命令,但不显示具体命令,此处可在命令中用@符抑制命令输出
-w显示执行前执行后的路径
-C dir 指定 makefile所在的目录

没有指定目标时,默认使用第一个目标
如果指定,则执行对应的命令

3.编译流程详解

第一次编译两小时
第二次编译五分钟
分开来写,保证只编译有改动的代码

'’'c
#calc:
#gcc add.cpp sub.cpp multi.cpp calc.cpp -o calc
calc:add.o sub.o multi.o
gcc add.o sub.o multi.o calc.cpp -o calc
add.o:add.cpp
gcc -c add.cpp -o add.o
sub.o:sub.cpp
gcc -c sub.cpp -o sub.o
multi.o:multi.cpp
gcc -c multi.cpp -o multi.o
‘’’

gcc/g++编译流程详解

gcc -lstdc++ main.cpp 直接从源代码到目标可执行文件了

把过程拆分

预处理: gcc -E main.cpp>main.ii
编译: gcc-S main.ii得到名为 main.s 的汇编文件
汇编: gcc -c main.s得到名为 main.o 的二进制文件
链接: gcc -lstdc++ main.o得到名为 a.out 的可执行文件

3 Makefile 中的变量

系统变量

$*不包括扩展名的目标文件名称
$+ 所有的依赖文件,以空格分隔
$<表示规则中的第一个条件
? 所 有 时 间 戳 比 目 标 文 件 晚 的 依 赖 文 件 , 以 空 格 分 隔 ?所有时间戳比目标文件晚的依赖文件,以空格分隔 ?@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分隔
$% 如果目标是归档成员,则该变量表示目标的归档成员名称

系统常量(可用make-p查看) 工

AS 汇编程序的名称,默认为as
CC C编译器名称 默认c
CPP C预编译器名称 默认 cc -E
CXX C++ 编译器名称默认g++
RM文件删除程序别名默认rm -f

自定义定量

定义:变量名=变量值

使用: ( 变 量 名 ) / (变量名)/ ()/{变量名}

make / make install

在软件开发中, make 是一个常用的构建自动化工具,它使用 Makefile 文件来定义如何编译和链接程序。 make 命令会根据 Makefile 中的规则来执行相应的命令。

  1. make :当你在命令行中输入 make 并执行时, make 会查找当前目录下的 Makefile 文件(或者你指定的其他名称的文件,如 makefile 或 GNUmakefile ),然后根据文件中定义的规则来执行构建过程。如果没有指定目标, make 默认执行第一个目标。

  2. make install :这是一个在 Makefile 中定义的特定目标,通常用于将编译好的程序安装到系统的某个目录下。这个目标会执行一些命令,比如复制可执行文件到 /usr/local/bin ,或者安装库文件到 /usr/local/lib 等。使用 make install 命令时,实际上是告诉 make 执行 Makefile 中的 install 目标。例如,一个简单的 Makefile 可能包含如下内容:
    all: myprogram
    myprogram: main.o
    gcc -o myprogram main.o
    install:
    cp myprogram /usr/local/bin
    clean:
    rm -f myprogram main.o

在这个例子中: make 命令会默认构建 all 目标,也就是编译 myprogram 。 make install 命令会执行 install 目标,将 myprogram 复制到 /usr/local/bin 目录。 make clean 命令会执行 clean 目标,删除编译生成的文件。

参考

makefile从入门到项目编译实战

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eternal-Student

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值