MAKEFILE学习视频地址:https://www.bilibili.com/video/BV1Xt4y1h7rH/?p=2&vd_source=305f791c703672cea3129189ddda734f
目标:一般指要编译的目标,也可以是一个动作
依赖:指执行当前目标所要依赖的选项,包括其它目标,某个具体文件或库等一个目标可以有多个依赖
命令:该目标下要执行的具体命令,可以没有,也可以有多条。多条时,每条命令一行
3:gcc/g++编译流程详解
gcc –lstdc++ main.cpp:直接从源代码到目标可执行文件了
把过程拆分
预处理:gcc –E main.cpp>main.ii
编译: gcc –S main.ii得到名为main.s的汇编文件
汇编: gcc –c main.s得到名为main.o(.obj)的二进制文件
链接: gcc –lstdc++ main.o 得到名为a.out的可执行文件
3:Makefile中的变量
系统变量:
$* 不包括扩展名的目标文件名称
$+ 所有依赖文件,以空格分隔
$< 表示规则中的第一个条件
$? 所有时间戳(NWYA)比目标文件晚的依赖文件,以空格分隔
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分隔
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
系统常量:(可用make –p查看)
AS 汇编程序的名称,默认为as
CC C编译器名称,默认为cc
CPP C预编译器名称,默认为cc –E
CXX C++编译器名称,默认为g++
RM 文件删除程序别名,默认为rm –f
自定义定量
定义:变量名=变量值
使用:$(变量名)/${变量名}
4:Makefile中的伪目标和模式匹配
伪目标 .PHONY:clean
声明目标为伪目标之后,makefile将不会判断目标是否存在或该目标是否需要更新
%.o:%.cpp .o依赖于对应的.cpp
Wildcard $(wildcard ./*.cpp)获取当前目录下所有的.cpp文件
Patsubst $(patsubst %.cpp,%.o,./*.cpp)将对应的cpp文件名替换成.o文件名
5:Makefile运行流程
保证目标是用最新的依赖生成的
第一次完全编译,后面只编译最新的代码(部分编译)
6:Makefile中编译动态链接库.dll,.so库文件
动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载,所以只需要维护一个地址
-fPIC 产生位置无关的代码
-shared 共享
-l(小L) 指定动态库
-I(大i) 指定头文件目录,默认当前目录
-L 手动指定库文件搜索目录,默认只链接共享目录
动态链接库 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享
动态 运行时才去加载 动态加载
链接 指库文件和二进制程序分离,用某种特殊手段维护两者之间的关系
库 库文件 .dll .so
7:Makefile中编译静态链接库 .lib .a
静态链接库:会把库中的代码编译到二进制文件中,当程序编译完成后,该库文件可以删除,而动态链接库不行,动态链接库必须与程序同时部署,还要保证程序加载得到库文件
与动态库相比,静态库可以不用部署(已经被加载到程序里面了),而且运行时速度更快(因为不用去加载),但是会导致程序体积更大,并且库中的内容如果更新,则需要重新编译生成程序
objdump –DC main>main.txt
8:Makefile中通用部分做公共头文件
Makefile中,都是先展开所有变量,再调用指令。不受文件顺序的影响
= 赋值,但是用终值,就是不管变量调用写在赋值前还是赋值后,调用时都是取终值
:= 赋值,但是只受当前行及之前的代码影响,而不受后面的赋值影响
9:makefile中调用shell命令
10:Makefile中的嵌套调用和多项目同时编译
11:Makefile中的条件判断
Ifeq 判断是否相等,相等返回true,不相等返回false
Ifneq 判断是否不相等,相等返回true,不相等返回false
Ifdef 判断变量是否存在,存在返回true,不存在返回false
Ifndef 判断变量是否不存在,不存在返回true,存在返回false
#ifndef判断一个变量是否无值,无值返回true,有值返回false
#ifdef判断一个变量是否有值,有值返回true,无值返回false
Ifeq($(A),123) Else endif
Ifeq,ifneq与条件之间要有空格,不然会报错。可以只有if,没有else,但是没有elseif的用法,如果要实现elseif,就要写嵌套
Ifdef A #(变量名称前不需要加$号) Else Endef A=123 ifneq ($(A),123) RS1=YES else RS1=NO endif ifdef A RS2=YES else RS2=NO endif #判断变量不存在 ifndef A RS3=YES else RS3=NO endif B=
#ifndef判断一个变量是否无值,无值返回true,有值返回false
#ifdef判断一个变量是否有值,有值返回true,无值返回false
ifndef B RS4=YES else RS4=NO endif bar = foo = $(bar) ifdef foo frobozz = yes else frobozz = no endif all: #echo $(RS1) #echo $(RS2) #echo $(RS3) #echo $(A) #echo $(B) #echo $(RS4) echo $(frobozz)
#变量传值方法
echo $(FLAG)
变量传值方法:
方法一:在执行makefile是传入
例如:make FLAG=100
方法二:
命令行传参 make –f Makefile FLAG=456,如果有Makefile,则可写成make FLAG=456
12:Makefile中的循环
标签:文件,变量,Makefile,编译,cpp,main From: https://www.cnblogs.com/gaoyuxia/p/16833260.html