linux C语言Makefile
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博客
相关文章:
linux C语言Makefile
ChatGPT 在Linux中使用Makefile来自动化C语言项目的构建过程是很普遍的实践。Makefile是一个包含了一系列构建目标及如何构建这些目标的依赖和规则的文本文件。 一个基本的Makefile例子可能会像这样: # 定义编译器 CCgcc# 定义编译选项 CFLAGS-I.# 定义可执行文件…...
pgvector扩展在IvorySQL Oracle兼容模式下的应用实践
向量数据库是生成式人工智能(GenAI)的关键组成部分。作为PostgreSQL的重要扩展,pgvector支持高达16000维的向量计算能力,使得PostgreSQL能够直接转化为高效的向量数据库。 IvorySQL基于PostgreSQL开发,因此它同样支持添加pgvector扩展。在Ora…...
c++ 线程概述
C中的线程是并发编程的重要组成部分,它允许程序同时执行多个任务。以下是对C线程的概述: 基本概念: 并发:意味着两个或多个任务同时执行。在单核CPU上,由于只有一个CPU,某一时刻只能执行一个任务࿰…...
纯血鸿蒙APP实战开发——短视频切换实现案例
短视频切换实现案例 介绍 短视频切换在应用开发中是一种常见场景,上下滑动可以切换视频,十分方便。本模块基于Swiper组件和Video组件实现短视频切换功能。 效果图预览 使用说明 上下滑动可以切换视频。点击屏幕暂停视频,再次点击继续播放…...
36.Docker-Dockerfile自定义镜像
镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 镜像是分层机构,每一层都是一个layer BaseImage层:包含基本的系统函数库、环境变量、文件系统 EntryPoint:入口,是镜像中应用启动的命令 其他:在…...
【webrtc】MessageHandler 4: 基于线程的消息处理:以Fake 收发包模拟为例
G:\CDN\rtcCli\m98\src\media\base\fake_network_interface.h// Fake NetworkInterface that sends/receives RTP/RTCP packets.虚假的网络接口,用于模拟发送包、接收包单纯仅是处理一个ST_RTP包 消息的id就是ST_RTP 类型,– 然后给到目的地:mediachannel处理: 最后消息消…...
C#运算符“/”使用方法
C#中,当需要对两个整数进行除法运算时,结果会被截断为整数部分,即使结果本应是一个小数。这是因为整数除法会丢弃小数部分,只保留整数部分。 要想保留小数部分,需要将至少其中一个操作数转换为float、double或者 deci…...
虚拟机网络桥接模式无法通信,获取到的ip为169.254.X.X
原因:VMware自动选择的网卡可能不对 解决:编辑-虚拟网络编辑器-更改桥接模式-选择宿主机物理网卡,断开虚拟机网络连接后重新连接即可...
【数据结构】初识数据结构
引入: 哈喽大家好,我是野生的编程萌新,首先感谢大家的观看。数据结构的学习者大多有这样的想法:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学的很累。我…...
相机知识的补充
一:镜头 1.1MP的概念 相机中MP的意思是指百万像素。MP是mega pixel的缩写。mega意为一百万,mega pixel 指意为100万像素。“像素”是相机感光器件上的感光最小单位。就像是光学相机的感光胶片的银粒一样,记忆在数码相机的“胶片”ÿ…...
在Linux操作系统中实现磁盘开机自动挂载
当一个分区创建好,然后文件系统创建完毕之后, 需要使用mount命令将分区挂载到空目录上,这个挂载关系是临时的,也就是说当重启机器的时候,硬盘分区于空目录之间的挂载关系就会解除。 磁盘于目录之间的挂载关系断开意味…...
单片机编程实例400例大全(100-200)
今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些,我大概看了下,很多都具备实际产品的参考价值。 今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些,我大概看了下,很多都具备实际…...
新兴游戏引擎Godot vs. 主流游戏引擎Unity和虚幻引擎,以及版本控制工具Perforce Helix Core如何与其高效集成
游戏行业出现一个新生事物——Godot,一个免费且开源的2D和3D游戏引擎。曾经由Unity和虚幻引擎(Unreal Engine)等巨头主导的领域如今迎来了竞争对手。随着最近“独特”定价模式的变化,越来越多的独立开发者和小型开发团队倾向于选择…...
Leetcode—1652. 拆炸弹【简单】
2024每日刷题(127) Leetcode—1652. 拆炸弹 实现代码 class Solution { public:vector<int> decrypt(vector<int>& code, int k) {int codeSize code.size();vector<int> ans(codeSize, 0);if(k 0) {return ans;}if(k > 0)…...
JAVASE---抽象类相关
instanceof 和类型转换 System.out.println(X instanceof Y );主要看X与Y之间是否存在父子(继承)关系,如果存在则编译可完成,否则无法 进行编译。 1.父类引用指向子类的对象 2.把子类转换为父类,向上转型; 3.把父类转…...
深入理解C++中的inline函数
在C编程中,我们经常会遇到inline关键字,它用于修饰函数,以建议编译器将该函数的调用替换为函数体的直接拷贝。这就是inline函数的基本概念。然而,inline函数并非真正意义上的函数,而只是一种"在调用点插入函数体&…...
Rust 动态数组Vector
导航 一、动态数组是什么,怎么用1、动态数组Vector是什么2、动态数组怎么用(1)创建动态数组(2)尾部追加元素(3)尾部删除元素(4)删除指定位置元素(5࿰…...
Linux主机重启后报错:[FAILED] Failed to start Switch Root.
一、问题描述 某次云主机因计费问题,导致批量重启,重启后发现某台云主机竟进入紧急救援模式(emergency模式),如下所示: 二、原因及处理 1)原因:加载根分区失败,导致无…...
git--.gitignore--使用/详解/实例
简介 本文介绍git的.gitignore忽略文件的用法。 项目中并不是所有文件都需要保存到版本库中的,例如“target”目录及目录下的文件就可以忽略。 忽略某个文件(不提交到版本库的方法):在Git工作区的根目录下创建一个.gitignore文件…...
初识java——javaSE(2)--运算符与逻辑控制【求个关注】
文章目录 一 运算符1.1 算术运算符当两个不同类型的值相加时:/ 运算符%运算符 1.2 关系运算符1.3 逻辑运算符短路:逻辑非 1.4 位运算符&|^位运算符当作逻辑运算符中使用 ~>><<>>> 1.5 赋值运算符1.6 三目运算符 二 逻辑控制if语…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
