首页 > 其他分享 >Makefile

Makefile

时间:2022-10-27 18:37:02浏览次数:82  
标签:文件 变量 Makefile 编译 cpp main

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

相关文章

  • makefile的基本使用方法
    41P-makefile基础规则makefile:管理项目。 命名:makefile Makefile---make命令 1个规则: 目标:依赖条件 (一个tab缩进)命令 1.目标的时间必须晚于依赖条件的时间,否则,......
  • Makefile
    MAKEFILE学习视频地址:https://www.bilibili.com/video/BV1Xt4y1h7rH/?p=2&vd_source=305f791c703672cea3129189ddda734f目标:一般指要编译的目标,也可以是一个动作依赖:指执行......
  • vscode调试C++代码,及makefile
      launch.json{//使用IntelliSense了解相关属性。//悬停以查看现有属性的描述。//欲了解更多信息,请访问:https://go.microsoft.com/fwlink/?......
  • (三)Makefile
    1什么是Makefile一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪......
  • Makefile
    MAKEFILE学习视频地址:https://www.bilibili.com/video/BV1Xt4y1h7rH/?p=2&vd_source=305f791c703672cea3129189ddda734f目标:一般指要编译的目标,也可以是一个动作依赖:指执行......
  • makefile学习
    makefile书写规则TARGET...:PREREQUISITES...COMMANDTARGET:规则目标,可以是一个objectfile(目标文件),也可以是一个执行文件,还可以是一个标签(label)。PREREQUISITE......
  • Linux系统编程04-Makefile
    文件命名:makefile或Makefile规则:一个Makefile文件中可以有一个或多个规则目标...:依赖...​ 命令(shell命令)​ ...目标:最终生成的文件依赖:......
  • 【AI白身境】只会用Python?g++,CMake和Makefile了解一下
    今天是新专栏《AI白身境》的第六篇,所谓白身,就是什么都不会,还没有进入角色。对于大部分小白来说,因为python用的太爽,以致于或许都没有听说过CMake。python是脚本语言,而当前大......
  • 第2天 汇编语言与makeFile
    汇编orgorigin表示程序加载的开始地址,也就是将程序从什么位置进行加载JMP相当于c语言的goto语句,无条件跳转。jmpentry表示跳转到entry语句块。MOV数据传送指令,需......
  • VScode开发STM32/GD32单片机-MakeFile工程JlinkRTT配置
    本次使用开发板为STM32F401CCU6,使用CubeMX配置一个Makefile工程  配置时候为内部时钟  工程选择makefile工程类型 只生成需要的文件  用VSCode打开后显......