linux C语言Makefile

news2024/11/16 12:54:48

ChatGPT

在Linux中使用Makefile来自动化C语言项目的构建过程是很普遍的实践。Makefile是一个包含了一系列构建目标及如何构建这些目标的依赖和规则的文本文件。
一个基本的Makefile例子可能会像这样:

# 定义编译器
CC=gcc

# 定义编译选项
CFLAGS=-I.

# 定义可执行文件
EXECUTABLE=program

# 定义源文件
SOURCES=main.c utils.c

# 定义对象文件
OBJECTS=$(SOURCES:.c=.o)

# 默认目标
all: $(EXECUTABLE)

# 构建可执行文件
$(EXECUTABLE): $(OBJECTS)
    $(CC) -o $@ $^

# 依赖规则
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

# 清理规则
clean:
    rm -f $(EXECUTABLE) $(OBJECTS)

这个Makefile定义了一些变量,例如CC为C编译器,CFLAGS为编译器选项,以及执行文件、源文件和对象文件的名称。
解释一下这些规则和目标:
- 默认目标 all:当仅仅在终端中输入 make 时,默认会尝试构建该目标。在这里,它依赖于 $(EXECUTABLE),即最终的程序。
- 生成可执行文件的规则描述了如何从对象文件 $(OBJECTS) 构建出目标可执行文件 $(EXECUTABLE)。
- 生成对象文件的模式规则 %.o: %.c 说明了怎样从每个 .c 源文件生成 .o 对象文件。
- 清理目标 clean:这个目标可以通过运行 make clean 在命令行中来清理所有的中间文件和可执行文件,以便重新构建。
使用这个Makefile构建项目相当简单,只需要在包含Makefile的目录中运行`make`命令。如果要清除构建生成的文件,可以运行`make clean`命令。
根据实际情况,Makefile可能会包含更复杂的依赖关系、条件判断、函数等,但大部分Makefile都遵循这种基本结构。 

文心一言

在Linux系统中,使用C语言编程时,经常需要编写Makefile文件来自动化构建(编译、链接等)程序。Makefile定义了如何从源代码生成目标文件,并最终生成可执行文件。下面是一个简单的C语言项目的Makefile示例:

# 定义编译器  
CC=gcc  
  
# 定义源文件  
SRCS=main.c file1.c file2.c  
  
# 定义目标文件  
OBJS=$(SRCS:.c=.o)  
  
# 定义最终的可执行文件  
TARGET=my_program  
  
# 默认目标:构建可执行文件  
all: $(TARGET)  
  
# 构建可执行文件  
$(TARGET): $(OBJS)  
 $(CC) $(OBJS) -o $(TARGET)  
  
# 编译源文件生成目标文件  
%.o: %.c  
 $(CC) -c $< -o $@  
  
# 清除所有生成的目标文件和可执行文件  
clean:  
 rm -f $(OBJS) $(TARGET)

在这个Makefile中:

CC 变量定义了使用的编译器(这里是gcc)。
SRCS 变量列出了所有的源文件。
OBJS 变量通过字符串替换将源文件列表中的 .c 后缀替换为 .o 后缀,得到所有目标文件的列表。
TARGET 变量定义了最终的可执行文件的名称。
all 目标是一个默认目标,它依赖于 $(TARGET),所以当你运行 make 命令时,会构建可执行文件。
$(TARGET) 目标依赖于所有的目标文件 $(OBJS),并使用编译器将它们链接成一个可执行文件。
%.o: %.c 是一个模式规则,它告诉make如何将 .c 源文件编译成 .o 目标文件。$< 和 $@ 是自动变量,分别代表依赖项(在这里是 .c 文件)和目标(在这里是 .o 文件)。
clean 目标用于清除所有生成的目标文件和可执行文件。当你运行 make clean 时,它会执行这个目标。
可以根据项目需求修改这个Makefile。例如,如果项目包含头文件或库文件,可能需要添加包含路径(-I 选项)或链接库(-l 选项)到编译和链接命令中。

讯飞星火

在Linux系统中,使用C语言编写的程序可以通过Makefile进行编译和链接。以下是一个简单的Makefile示例:        

# 定义编译器
CC = gcc

# 定义编译选项
CFLAGS = -Wall -g

# 定义目标文件
TARGET = my_program

# 定义源文件
SOURCES = main.c file1.c file2.c

# 定义目标文件的依赖关系
$(TARGET): $(SOURCES)
    $(CC) $(CFLAGS) -o $(TARGET) $(SOURCES)

# 定义清除规则
clean:
    rm -f $(TARGET)

    在这个示例中,我们定义了编译器(CC)、编译选项(CFLAGS)、目标文件(TARGET)和源文件(SOURCES)。然后,我们定义了一个规则,用于将源文件编译并链接为目标文件。最后,我们定义了一个清除规则,用于删除生成的目标文件。

Kimi

在Linux环境下,使用C语言进行项目开发时,Makefile是一个常用的工具,它定义了一套规则来指定如何编译和链接程序。下面是一个简单的Makefile示例,它展示了如何编译一个C语言项目。

# 定义项目名称
PROJECT_NAME = my_project

# 定义源文件目录
SRC_DIR = src

# 定义头文件目录
INC_DIR = include

# 定义对象文件目录
OBJ_DIR = obj

# 定义编译器
CC = gcc

# 定义编译选项
CFLAGS = -Wall -I$(INC_DIR) -c

# 定义链接选项
LDFLAGS = -L./lib -lmylib

# 定义链接器
LD = $(CC)

# 定义源文件
SRC = $(wildcard $(SRC_DIR)/*.c)

# 定义对象文件
OBJ = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRC))

# 定义默认目标
all: $(PROJECT_NAME)

# 链接目标
$(PROJECT_NAME): $(OBJ)
	$(LD) $(LDFLAGS) $^ -o $@

# 编译对象文件
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
	@mkdir -p $(OBJ_DIR)
	$(CC) $(CFLAGS) $< -o $@

# 清理生成的对象文件和可执行文件
clean:
	rm -rf $(OBJ_DIR) $(PROJECT_NAME)

# 打印Makefile中定义的变量
print:
	@echo "Project Name: $(PROJECT_NAME)"
	@echo "Source Directory: $(SRC_DIR)"
	@echo "Include Directory: $(INC_DIR)"
	@echo "Object Directory: $(OBJ_DIR)"
	@echo "Compiler: $(CC)"
	@echo "Compilation Flags: $(CFLAGS)"
	@echo "Linker Flags: $(LDFLAGS)"
	@echo "Linker: $(LD)"
	@echo "Source Files: $(SRC)"
	@echo "Object Files: $(OBJ)"

.PHONY: all clean print

这个Makefile包含了以下几个部分:

项目名称:定义项目的名称,用于生成最终的可执行文件。

目录定义:定义源文件、头文件和对象文件的存放目录。

编译器和链接器:指定使用的C编译器和链接器。

编译选项:定义编译时的选项,如包含目录和警告选项。

链接选项:定义链接时的选项,如链接库的路径和名称。

源文件和对象文件:使用通配符匹配所有源文件,并生成对应的对象文件。

默认目标:定义make命令执行时的默认目标。

链接规则:定义如何将对象文件链接成最终的可执行文件。

编译规则:定义如何编译单个源文件生成对象文件。

清理规则:定义如何清理生成的对象文件和可执行文件。

打印规则:定义一个规则来打印Makefile中定义的变量。

伪目标:.PHONY声明指定了clean和print是伪目标,即使在文件系统中没有与它们同名的文件,也可以执行它们定义的命令。

要使用这个Makefile,需要将其保存为Makefile或makefile,并在项目根目录下运行make命令来编译项目。如果想执行清理或打印变量,可以运行make clean或make print。

通义灵码

在Linux环境下,编写C语言项目的Makefile是为了自动化编译和链接过程,确保项目中的源文件按照正确的顺序和依赖关系编译成可执行文件或库文件。以下是一个通用的Makefile示例,适用于一个简单的C语言项目:

# 定义编译器、编译选项、目标文件名、源文件列表等变量
CC := gcc
CFLAGS := -std=c11 -pedantic -Wall -Wextra -O2
LDFLAGS := -lm  # 如果项目需要链接数学库,例如使用了数学函数

TARGET := my_program
SRCS := $(wildcard *.c)  # 获取当前目录下所有.c文件
OBJS := $(SRCS:.c=.o)  # 将源文件名替换为对应的对象文件名

# 默认目标(phony target),编译整个项目
.PHONY: all
all: $(TARGET)

# 主要目标(可执行文件)的规则
$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) $(OBJS) -o $@ $(LDFLAGS)

# 普通对象文件的规则(%.o: %.c)
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

# 清理目标,删除中间对象文件和最终生成的可执行文件
.PHONY: clean
clean:
	rm -f $(OBJS) $(TARGET)

解释各部分含义:

  • CC: 定义C编译器为gcc
  • CFLAGS: 定义编译选项,如遵循C11标准(-std=c11)、启用额外警告(-pedantic -Wall -Wextra)和优化级别(-O2)。根据项目需求调整这些选项。
  • LDFLAGS: 定义链接选项,此处假设项目需要链接数学库(-lm),如果有其他库依赖,应在此处添加相应的链接选项。
  • TARGET: 定义生成的可执行文件名。
  • SRCS: 使用wildcard函数查找当前目录下的所有.c文件,将其路径赋值给变量。
  • OBJS: 将SRCS中的.c扩展名替换为.o,得到相应的对象文件列表。

规则部分:

  • .PHONY: all: 声明all是一个伪目标(不是实际文件),表示其存在的目的是为了组织其他目标的依赖关系。
  • all: $(TARGET): 规定all目标依赖于$(TARGET)(即主程序),当执行make all时,会先确保$(TARGET)被正确构建。
  • $(TARGET): $(OBJS): 定义主程序目标的依赖关系,即由所有的对象文件$(OBJS)链接而成。规则体中使用编译器$(CC),编译选项$(CFLAGS),对象文件列表$(OBJS),输出文件名$@(即$(TARGET)),以及链接选项$(LDFLAGS)来完成链接过程。
  • %.o: %.c: 这是一条模式规则,定义了如何从单个.c源文件生成对应的.o对象文件。规则体中使用编译器$(CC),编译选项$(CFLAGS),源文件名$<(即%.c),输出文件名$@(即%.o),执行编译命令。
  • .PHONY: clean: 声明clean是一个伪目标。规则体中使用rm命令删除中间对象文件$(OBJS)和最终生成的可执行文件$(TARGET)

使用此Makefile,只需在终端中执行make命令即可编译整个项目。若想清理中间文件和生成物,执行make clean。如果有新增或删除源文件,Makefile会自动识别变化并仅编译改动过的源文件。

相关链接

makefile_makefile 固化字符串-CSDN博客

重新configure和生成Makefile_configure重新编译-CSDN博客

Makefile变量赋值_makefile变量赋值命令的结果-CSDN博客

Makefile中执行pwd赋值给变量_makefile中赋路径至变量-CSDN博客

Makefile搜索到字符串后,添加字符串-CSDN博客

configure指定编译头文件和库文件路径_configure 指定库路径-CSDN博客

动态链接库so_.so动态链接库-CSDN博客

make install 安装的卸载_make install怎么卸载-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1643959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ : list类及其模拟实现

目录 一、list的介绍和使用 list的介绍 list的使用 1.list的构造 构造函数 2.list iterator 的使用 3.list capacity 4.list element access 5.list modifiers 6.list的迭代器失效 二、list的模拟实现 要点 list类模拟实现部分接口全部代码展示 一、list的介绍和使…

C++笔试强训day13

目录 1.⽜⽜冲钻五 2.最长无重复子数组 ​编辑 3.重排字符串 1.⽜⽜冲钻五 链接 简单逻辑题&#xff0c;按照题目意思模拟就能过。 详细代码&#xff1a; #include <iostream>using namespace std;int n,k; void solve() {cin >> n >> k;string s;cin…

HNU-人工智能-实验2-简单CSP问题

人工智能-实验2 计科210x 甘晴void 一、实验目的 求解约束满足问题 使用回溯搜索算法求解八皇后问题 二、实验平台 课程实训平台https://www.educoder.net/paths/369 三、实验内容 3.0 题目要求 回溯搜索算法 搜索与回溯是计算机解题中常用的算法&#xff0c;很多问…

C#知识|如何在WinForm窗体中实现分割线绘制?

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 在上位机UI设计中经常会用到分割线&#xff0c;用来分割界面区域。 像在KingSCADA、杰控、昆仑通态、WinCC、组态王、力控、易控等组态软件中非常简单&#xff0c;有现成的划线操作&#xff0c;选中相关工具直接绘制即…

一文看懂卷积神经网络CNN(2)—卷积神经网络

目录 一、卷积 1、卷积的定义 &#xff08;1&#xff09;一维卷积 &#xff08;2&#xff09;二维卷积 2、互相关 3、互相关和卷积的区别 4、卷积的变种 5、卷积的数学性质 &#xff08;1&#xff09;交换性 &#xff08;2&#xff09;导数 二、卷积神经网络 1、卷…

Linux 内核简介

操作系统简介 操作系统概念&#xff1a;操作系统处于硬件和应用程序的中间层&#xff0c;控制和管理整个计算机系统的硬件和软件资源&#xff0c;提供给用户和其他软件方便的接口和环境&#xff0c;它是计算机系统的最基本的系统软件。 操作系统功能: 处理机管理存储器管理设…

基于Springboot的房屋租赁管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的房屋租赁管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

01 JVM -- JVM 体系结构、HotSpot

1. JVM、HotSpot、 OpenJDK 的区别 JVM (Java Virtual Machine) 是一个虚拟机HotSpot 是 JVM 规范的一个实现。HotSpot 虚拟机通过即时编译 (JIT) 技术将 Java 字节码转换为本地机器码&#xff0c;以提高程序的执行效率。OpenJDK 是一个项目名&#xff0c;它在 HotSpot 的基础…

puzzle(1041)植此青绿、拼图迷宫

目录 植此青绿 简单模式 困难模式 拼图迷宫 核心规则 中级模式具体规则 十字的交叉点 十字的端点、L的交叉点 L的端点 直线、矩形 U的端点 中级模式精选关卡 基本策略 高级模式具体规则 Z形状 T形状 高级模式精选关卡 植此青绿 最强大脑同款项目。 给出7个正…

JavaEE企业级开发中常用的JDK7和JDK8的时间类

JDK7时间类 全世界的时间有一个统一的计算标准 在同一条经线上的时间是一样的 格林威治时间 简称GMT 计算核心 地球自转一天是24小时 太阳直射正好是12小时 但是误差太大 现在用原子钟来代替 用铯原子震动的频率来计算时间&#xff0c;作为世界的标准时间UTC 中国标准时间…

开源版本管理系统的搭建二:SVN部署及使用

作者&#xff1a;私语茶馆 1. Visual SVN Server部署 SVN Server部署包括&#xff1a; 创建版本仓库创建用户 这些部署是通过VisualSVN Server Manager实现的&#xff0c;如下图&#xff1a; VisualSVN Server Manager&#xff08;安装后自带&#xff09; 1.1.SVN 初始化配…

流畅的Python阅读笔记

五一快乐的时光总是飞快了&#xff0c;不知多久没有拿起键盘写文章了&#xff0c;最近公司有Python的需求&#xff0c;想着复习下Python吧&#xff0c;然后就买了本Python的书籍 书名&#xff1a; 《流畅的Python》 下面是整理的一个阅读笔记&#xff0c;大家自行查阅&#xf…

ROS专栏—基于STM32F103的INA219电源数据采集

一、专栏介绍 这篇博客为ROS小车专栏的第一篇&#xff0c;自己想要做一个ROS小车&#xff0c;同时通过CSDN平台记录我的制作过程&#xff0c;为后来者提供一些参考吧&#xff0c;恩我也是从零开始摸索&#xff0c;可能会有很多错误和问题&#xff0c;希望大家多多包涵。 二、…

Python 全栈系列241 GFGo Lite迭代

说明 随着整个算网开发逐渐深入&#xff0c;各个组件、微服务的数量、深度在不断增加。由于算网是个人项目&#xff0c;我一直按照MVP(Minimum Viable Product )的原则在推进。由于最初的时候对架构、算法和业务的理解并没有那么深刻&#xff0c;所以MVP的内容还是在不断变化&…

数据结构十:哈希表

本次将从概念上理解什么是哈希表&#xff0c;理论知识较多&#xff0c;满满干货&#xff0c;这也是面试笔试的一个重点区域。 目录 一、什么是哈希表 1.0 为什么会有哈希表&#xff1f; 1.1 哈希表的基本概念 1.2 基本思想 1.3 举例理解 1.4 存在的问题 1.5 总结 二、…

基于TL431基准电压源的可调恒压恒流源的Multisim电路仿真设计

1、线性电源的工作原理 在我们日常应用里&#xff0c;直流电是从市电或电网中的交流电获取的。例如15V直流电压源、24V直流电压源等等。交流电变为直流电的过程大概分为一下几步&#xff1a; 首先&#xff0c;交流电通过变压器降低其电压幅值。接着&#xff0c;经过整流电路进…

01_SpringBoot简单搭建入门程序

目录 1、先创建一个java项目2、导入依赖3、将Java项目修改为SpringBoot项目4、编写一个测试的Controller5、测试(创建一个*.http的文件)方式1&#xff1a;方式2&#xff1a;可以直接在浏览器访问该地址方式3&#xff1a;使用postman也可以 1、先创建一个java项目 我的项目结构…

智能化工单助力业务运作:亿发解析工单系统的功能与适用场景

在现代企业管理中&#xff0c;工单系统扮演着至关重要的角色。面对市面上众多的工单系统&#xff0c;我们可以根据不同的依据进行分类&#xff0c;以更好地满足企业的需求。 1、按部署方式分类&#xff1a; 按照部署方式可以分为本地化部署工单系统和云端SaaS服务工单系统。 …

步态识别论文(6)GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation

摘要: 视角变化导致步态外观存在显着差异。因此&#xff0c;识别跨视图场景中的步态是非常具有挑战性的。最近的方法要么在进行识别之前将步态从原始视图转换为目标视图&#xff0c;要么通过蛮力学习或解耦学习提取与相机视图无关的步态特征。然而&#xff0c;这些方法有许多约…

【java9】java9新特性之Optional类改进

其实Optional类在Java8中就引入了&#xff0c;用于避免null检查和NullPointerException指针问题。 在Java9中&#xff0c;Optional类得到了进一步的改进&#xff0c;增加了一些新的方法&#xff0c;使其更加灵活和易用。 以下是一些Java9中对Optional类的改进&#xff1a; s…