首页 > 其他分享 >编写一个 Makefile 文件,对阶段项目一的代码进行自动化编译

编写一个 Makefile 文件,对阶段项目一的代码进行自动化编译

时间:2024-06-14 18:54:12浏览次数:25  
标签:文件 定义 Makefile 源文件 编译 编写 TARGET

为了编写一个Makefile文件来自动化编译一个项目,我们需要知道项目中包含哪些源文件以及它们是如何组织的。假设我们有一个简单的项目,它包含两个C源文件`main.c`和`helper.c`,以及一个头文件`helper.h`。我们希望编译这些文件生成一个名为`project`的可执行文件。

以下是一个简单的Makefile示例,它定义了如何编译这个项目:

```makefile
# 定义编译器和编译选项
CC=gcc
CFLAGS=-Wall -Wextra -g

# 定义目标可执行文件名
TARGET=project

# 定义源文件列表
SOURCES=main.c helper.c

# 定义目标文件列表
OBJECTS=$(SOURCES:.c=.o)

# 默认目标
all: $(TARGET)

# 编译目标
$(TARGET): $(OBJECTS)
	$(CC) $(OBJECTS) -o $(TARGET) $(LDFLAGS)

# 编译每个源文件为对象文件
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

# 清理编译生成的文件
clean:
	rm -f $(OBJECTS) $(TARGET)

# 重新构建项目
rebuild: clean all

# 打印帮助信息
help:
	@echo "Available targets:"
	@echo "  all       - Build the project"
	@echo "  clean     - Remove all generated files"
	@echo "  rebuild   - Clean and rebuild the project"
	@echo "  help      - Print this help message"

在这个Makefile中,我们定义了以下内容:

  • CC 变量定义了使用的编译器,这里默认为 gcc
  • CFLAGS 变量定义了编译选项,例如 -Wall-Wextra 用于启用额外的警告,-g 用于生成调试信息。
  • TARGET 变量定义了最终生成的可执行文件名。
  • SOURCES 变量列出了所有源文件。
  • OBJECTS 变量通过模式替换从源文件列表生成对象文件列表。
  • all 目标是默认目标,它依赖于 $(TARGET),即项目可执行文件。
  • $(TARGET): $(OBJECTS) 规则定义了如何将对象文件链接成最终的可执行文件。
  • %.o: %.c 规则定义了如何将每个 .c 文件编译成 .o 文件。
  • clean 目标用于删除所有编译生成的文件。
  • rebuild 目标首先执行 clean,然后重新构建项目。
  • help 目标用于打印帮助信息。

要使用这个Makefile,只需将其保存为 Makefile 文件,并在包含该文件的目录中打开终端,然后输入 make 命令来编译项目。如果需要帮助,可以输入 make help

标签:文件,定义,Makefile,源文件,编译,编写,TARGET
From: https://www.cnblogs.com/ZGLi/p/18248471

相关文章

  • 用Ubuntu24编译打包6.9.4内核(仅供参考)
    目录环境介绍前期安装下载内核源代码并编译打包并更新内核重启无法进入系统问题注意事项环境介绍Ubuntu24/4U/12G/120G/NAT172.16.186.148/24rambo@test1:~$uname-aLinuxtest1.lab.example.com6.8.0-35-generic#35-UbuntuSMPPREEMPT_DYNAMICMonMay2015:51:52UT......
  • NGINX编译安装sticky
    提醒:目前sticky支持nginx22及以下版本,新版我试了24和26均会编译报错1、下载nginx安装包2、解压进到编译目录,有configure的目录,执行以下命令./configure\--prefix=/usr/local/nginx\--with-file-aio\--with-threads\--with-http_addition_module\--with-http_auth_reques......
  • 简单的Makefile文件解析
    Makefile文件解析#commonmakefileheader#"$(变量)"、"$makefile内置变量"表示变量值DIR_INC=../../include #头文件相对路径DIR_BIN=../../bin #可执行文件的相对路径DIR_LIB=../../libs #库的相对路径TARGET =iat_online_record_sample #目标变量BIN_TA......
  • Linux下编译arm64驱动代码汇编器报错
    简单来说就是错误的汇编Ir约束会导致编译器优化把这个操作数生成非法的汇编指令然后汇编器就会傻眼会报一个非常难懂的错误如下:/tmp/ccxxxxxx.s:Assemblermessages:/tmp/ccxxxxxx.s:xxx:错误:立即数越界atoperand3--'eorw3,w20,4294967295'我通过查看汇编手册发......
  • 【C++修行之道】类和对象(六)再谈构造函数(初始化列表)| explicit关键字 | static成员 |
    目录一、再谈构造函数1.1构造函数体赋值1.2初始化列表1.所有的成员,既可以在初始化列表初始化,也可以在函数体内初始化2.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)3.类中包含以下成员,必须放在初始化列表位置进行初始化:声明给缺省值也可以是其......
  • ubuntu22.04编译openwrt的lede-17.01一些错误的处理方式
    m4c-stack.c:55:26:error:missingbinaryoperatorbeforetoken“(“55|#elifHAVE_LIBSIGSEGV&&解决方法:wgethttps://raw.githubusercontent.com/keyfour/openwrt/2722d51c5cf6a296b8ecf7ae09e46690403a6c3d/tools/m4/patches/011-fix-sigstksz.patch-O......
  • nginx编译安装-麒麟v10Arm64
    环境信息操作系统:KylinLinuxAdvancedServerV10(Lance)架构:Armkeepalived版本:2.3.1编译安装依赖包yuminstallgccgcc-c++makeunzippcrepcre-develzlibzlib-devellibxml2libxml2-develreadlinereadline-develncursesncurses-develperl-develperl-ExtU......
  • keepalived编译安装-麒麟v10Arm64
    环境信息操作系统:KylinLinuxAdvancedServerV10(Lance)架构:Armkeepalived版本:2.3.1编译wgethttps://www.keepalived.org/software/keepalived-2.3.1.tar.gztarxvfkeepalived-2.3.1.tar.gzcdkeepalived-2.3.1/./configure--prefix=/usr/local/keepalivedmake......
  • c语言编译器的分类
    前言在上节《C语言编译和链接》中我们已经讲解了C语言编译器的概念,由于C语言的历史比较久,而且早期没有规范,整个计算机产业也都处于拓荒的年代,所以就涌现了很多款C语言编译器,它们各有特点,适用于不同的平台,本节就来给大家科普一下。我们分两部分介绍C语言的编译器,分别是......
  • Oracle报错:“Error in invoking target ‘agent nmhs’ of makefile...”
    Oracle报错:“Errorininvokingtarget‘agentnmhs’ofmakefile...”  前言:Oracle在安装过程中的报错一定要重视,这决定你后续是否能完成安装以及是否能使用。我这边会陆续汇总一些报错现象以及解决方案共享。##InstallProduct86%报错信息:“Errorininvokingtarget'......