首页 > 其他分享 >Makefile

Makefile

时间:2024-10-14 21:44:21浏览次数:8  
标签:gcc lib Makefile CALL build test COMPILER

Makefile是由target和命令构成的,最简单的Makefile:

build:
	gcc test.c -o test

然后执行 make build 就会执行gcc这条命令,但是一般推荐先将源文件构建为对象文件,然后再统一编译为可执行文件

build: test.o
	gcc test.o -o test

test.o:
	gcc test.c -c

文件目标test.o是build伪目标依赖的文件,当执行build是会首先去执行文件目标的操作,所以:后面的称为目标的依赖

这种对多文件来说会更合适

build: test.o lib.o
	gcc test.o lib.o -o test

test.o:
	gcc test.c -c
	
lib.o:
	gcc lib.c -c

除此之外,make编译时候可以指定很多Flags,例如

  • CC:指定C语言编译器
  • CXX:指定CPP语言编译器
  • CFLAGS:指定C选项
  • CXXFLAGS:指定CPP选项
  • CPPFLAGS:指定编译过程中预处理选项
  • LDFLAGS:指定链接器选项

make -p可以查看所有预设的变量

除此之外也可以定义一些自定义变量,使用变量直接用$()即可。变量还可以使用?=,这个表示只有make时没有指定时才生效,否则不会执行到

有点值得注意,就是变量的值永远都是字符串,不需要用双引号括起来

DEBUG = 1
EXECUTABLE_NAME = test

CC = gcc
CFLAGS = -g -O0

COMPILER_CALL = $(CC) $(CFLAGS)

build: test.o lib.o
	$(COMPILER_CALL) test.o lib.o -o $(EXECUTABLE_NAME)

test.o:
	$(COMPILER_CALL) test.c -c
	
lib.o:
	$(COMPILER_CALL) lib.c -c

makefile也支持条件语句,关键字有 ifeqifneqifdefifndefelseendif

DEBUG = 1
ifeq ($(DEBUG), 1)
	CFLAGS = -g -O0
else
	CFLAGS = -O3
endif

如果源文件很多的话,一个一个指定文件目标会很麻烦,所以就要通配符来简化操作

  • $<:第一个依赖
  • $@:文件目标名
  • $^:所有依赖名

然后可以通过%来匹配文件名

EXECUTABLE_NAME = test

CC = gcc
CFLAGS = -g -O0

COMPILER_CALL = $(CC) $(CFLAGS)
C_OBJECTS = test.o lib.o

build: $(C_OBJECTS)
	$(COMPILER_CALL) $(C_OBJECTS) -o $(EXECUTABLE_NAME)

%.o: %.c
	$(COMPILER_CALL) $< -c -o $@

我们还可以更进一步,因为C_OBJECTS还不够自动化,没有自动识别.o文件自动添加,所以可以通过内置函数去实现

  • $(wildcard <pattern...>):获取指定格式化的文件列表
  • $(dir <names...>):获取文件所在目录
  • $(suffix <names...>):获取文件后缀
  • $(basename <names...>:去除文件后缀
  • $(subst ,,:替换字符
  • $(patsubst <src_pattern>,<dst_pattern>,):按格式替换字符
  • $(strip ):去除开头和结尾的空白字符
EXECUTABLE_NAME = test

CC = gcc
CFLAGS = -g -O0

COMPILER_CALL = $(CC) $(CFLAGS)
C_SOURCES = $(wildcard *.c)
C_OBJECTS = $(patsubst %.c, %.o, $(C_SOURCES))

build: $(C_OBJECTS)
	$(COMPILER_CALL) $(C_OBJECTS) -o $(EXECUTABLE_NAME)

%.o: %.c
	$(COMPILER_CALL) $< -c -o $@

在makefile有两种目标,一种是文件目标,比如test.o,还有一种是伪目标,例如build,对于伪目标最好通过.PHONY标记

.PHONY: build

如果需要创建目录,需要额外创建一个目标来处理

create:
	@mkdir -p build

@会隐藏命令回显,而-p指的是如果目录不存在则创建,还有点值得注意的是,每行命令其实是拥有单独的shell环境,所以以下代码

create:
	@mkdir -p build
	@cd build
	@touch test

这个create不会在build目录下创建文件,因为对于touch来说,当前目录并没有进入build,可以如下执行

create:
	@mkdir -p build && cd build && touch test

标签:gcc,lib,Makefile,CALL,build,test,COMPILER
From: https://www.cnblogs.com/musing/p/18463119

相关文章

  • Linux读写者管理sharefile文件,多个客户端向服务器输送信息,由服务器为中转站将信息存入
    Linux系统读写者将文件存入sharefile文件中,同时由多个客户端向服务器输入通信信息,并由服务器为中转站,将信息传入sharefile文件中(由于读写者存入sharefile文件的路径问题,sharefile文件要放入Linux虚拟机的“公共”文件中,不然不能运行,同时要将文件分开每个Makefile文件都要放在对......
  • code blocks Makefile
    1)“File->New->Project”,选择“EmptyProject”并创建。2)选中Project,右键,选择“Addfiles”,将c/c++和headfiles加入工程。3)选中Project,右键,选择“Properties”,“Projectsettings”选项卡中的“Makefile”填入     Makefile文件名,并勾选“Thisisacustom......
  • 编译和链接以及makefile
    编译和链接以及makefile问题引出,为什么我们会忽略编译和链接这个步骤一定都会用到但却很少被重视的步骤——编译和链接,通常这两个步骤被我们的IDE封装的很完美,我们一般都是一件构建。但是一旦遇到错误的时候,尤其是链接相关的错误,很多人就束手无策了,所以今天就跟大家一......
  • Linux 基础入门操作-实验二 makefile使用介绍 和 实验三 hello 输出
    1介绍Makefile是linux下的项目管理工具,想象一下当有很多源文件需要编译、链接时,你只需执行make命令即可完成编译操作,这样是不是很方便呢。make命令执行时,需要一个Makefile文件,用来告诉make命令需要怎么样的去编译和链接程序,下面详细介绍Makefile的使用与书写规......
  • 一个简单的交叉编译riscv的makefile脚本
    为了编写一个使用特定交叉编译工具链(在这个例子中是`riscv64-unknown-linux-gnu-`)来编译`hello.c`的Makefile脚本,你需要设置`CROSS_COMPILE`变量,并在编译命令中使用这个变量来指定交叉编译器的路径。下面是一个简单的Makefile示例:```makefile#定义交叉编译工具链的前缀CROSS_COM......
  • 【Linux】Linux项目自动化构建工具-make/Makefile
    make/Makefile1.背景2.概念3.实例代码1.背景一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——......
  • 树莓派操作系统-利用Makefile创建内核镜像文件kernel8.img
    编写树莓派内核映像的过程可以等同于gcc的编译过程:预处理、编译、汇编、链接,后面还会加一步:将可执行文件转换成二进制的镜像文件。在MakeFile里的构建过程分为3步:1.将.c文件经过预处理、编译、汇编生成.o文件,将.S文件经过汇编生成.o文件。2.将.o文件经过链接生成.elf可执行文件......
  • Linux Makefile文件名处理函数知识详解
    GNUmake提供了一系列对文件名进行各种操作的函数:文件名替换、加前缀、去目录等。1.1dir函数:取路径名的目录dir函数用来从一个路径名中截取目录的部分。$(dirNAMES…)dir函数会从NAMES文件名序列中,取出各个文件路径名中的目录部分并返回.PHONY:allLIST=/home/wit/ban......
  • CMakeLists.txt 和 Makefile
    CMakeLists.txt和Makefile都是用于自动化编译和构建软件项目的配置文件,但它们在构建系统中扮演不同的角色,并且使用不同的构建工具。CMakeLists.txtCMakeLists.txt 文件是CMake构建系统的配置文件。CMake是一个跨平台的自动化构建系统,它使用 CMakeLists.txt 文件来生......
  • 学习makefile(2)
    1、Makefile规则 HelloWorld基本上所有程序员的所有编程语言一个最简单的例子,虽然makefile不是一门编程语言,但是我们同样可以在一个命令中终端上输出一个helloworldall:echo"HelloWorld"那上述例子中就有我们学习的第一个语法,echo前面必须只有TAB,且至少有一个TAB,不......