news 2026/6/12 12:35:29

学习笔记——Makefile

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
学习笔记——Makefile

基本概念

Makefile 是工程管理工具,用于编译多个源文件(可能在不同目录下),可以添加编译选项。

基本语法规则

makefile

目标: 依赖 [TAB] 规则命令

版本演进

版本1:直接编译

makefile

a.out: main.c func.c gcc main.c func.c -o a.out

版本2:使用内置变量

makefile

a.out: main.c func.c gcc $^ -o $@ # 不需要依赖文件 clean: rm a.out

内置变量说明:

  • $^:在本条规则中,表示所有的依赖文件

  • $@:在本条规则中,表示目标文件

执行示例:

# 第一次编译 linux@ubuntu:~/20251103/os_app/Make$ make # 源文件未被修改时再次编译 linux@ubuntu:~/20251103/os_app/Make$ make make: 'a.out' is up to date. # 清理生成的文件 make clean

说明:当产生目标文件的相关源文件没有被修改(没有被更新)时,Make 不会重新编译。

版本3:使用自定义变量

makefile

# 定义变量 SRC = main.c SRC += func.c # 追加变量 APP = a.out FLAG = -g # 编译选项,如调试信息 $(APP): $(SRC) gcc $^ -o $@ $(FLAG) clean: rm $(APP)

变量说明:

  • SRC:源文件列表

  • APP:生成的可执行文件名

  • FLAG:编译选项(如-g用于调试)

相关源文件

main.c

#include <stdio.h> #include "func.h" int main() { int a = 10; int b = 20; int c = add(a, b); printf("add is %d\n", c); c = sub(a, b); printf("sub is %d\n", c); }

func.c

int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; }

func.h

#ifndef __FUNC_H_ #define __FUNC_H_ int add(int a, int b); int sub(int a, int b); #endif

注意事项

  1. Makefile 文件名可以是makefileMakefile(建议使用后者)

  2. 命令前的缩进必须是 Tab 键,不能是空格

  3. 当执行make命令后,会在当前目录下查找 Makefile 文件

  4. make clean用于清理生成的文件

  5. Make 会检查文件的更新时间,如果依赖文件比目标文件新,才会重新编译

完整示例 Makefile

makefile

# 变量定义 SRC = main.c func.c APP = a.out FLAG = -g # 默认目标 $(APP): $(SRC) gcc $^ -o $@ $(FLAG) # 清理规则 clean: rm -f $(APP)

这个 Makefile 实现了:

  1. 一键编译所有源文件生成可执行文件

  2. 支持调试选项

  3. 提供清理功能

  4. 自动判断是否需要重新编译

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 20:41:31

程序员必学:检索增强生成(RAG)技术详解,解决大模型知识局限与幻觉问题,建议收藏学习!

本文详细介绍了检索增强生成(RAG)技术&#xff0c;解决大语言模型知识局限性。RAG通过引入外部知识库动态获取信息&#xff0c;提升模型知识覆盖、准确性和时效性&#xff0c;有效解决"幻觉"问题。文章系统阐述了RAG的流程、知识库构建、增强架构、检索策略及生成增强…

作者头像 李华
网站建设 2026/6/10 2:01:15

【建议收藏】普通程序员的AI进阶之路:大模型应用开发完全指南

本文阐述AI时代程序员依然有广阔发展空间&#xff0c;重点介绍了普通程序员如何学习大模型应用开发。内容涵盖大模型基础知识、提示工程、OpenAI API与LangChain框架应用、RAG与Agent技术实现&#xff0c;以及开源模型选择与微调等核心技能。通过系统学习这些知识&#xff0c;程…

作者头像 李华
网站建设 2026/6/10 11:13:36

容器镜像的五个维度:构建企业级最佳实践指南

在云原生时代,容器镜像已成为应用交付的标准单元。然而,一个高质量的容器镜像不仅仅是能运行应用那么简单。本文将从安全、性能、成本、管理、维护五个关键维度,深入探讨如何构建和管理生产级的容器镜像。 为什么需要多维度的容器镜像策略? Docker Hub上有超过1000万个容…

作者头像 李华
网站建设 2026/6/11 13:26:07

Mindyolo030如何做对抗训练

问题描述Mindyolo030可以做对抗训练吗&#xff1f;问题解答MindYOLO主要聚焦于YOLO系列算法的标准化实现&#xff08;如YOLOv3/v4/v5/v7/v8/X等&#xff09;&#xff0c;其核心功能集中在模型训练、推理、数据增强和优化器配置&#xff0c;但未在官方配置示例或文档中直接集成对…

作者头像 李华
网站建设 2026/6/10 11:04:38

计数if|

lc25931.mask ll也会溢出 转vec bool2.sort pii(nums,idx) 后标记自身 &#xff06;左右一次遍历即可class Solution { typedef long long ll; public:long long findScore(vector<int>& nums) {ll ret 0;int n nums.size();if (n 1) return nums[0];vector<bo…

作者头像 李华
网站建设 2026/6/10 12:46:07

不用盯电脑!小红书多号定时发布 + 数据聚合攻略

“A号笔记刚编完&#xff0c;切B号时退错账号&#xff1b;盯C号数据入神&#xff0c;漏了D号私信&#xff1b;凌晨爬起来掐高峰发笔记&#xff0c;结果还发错号……” 这是小红书多号运营者的日常&#xff1a;多号布局本想放大收益&#xff0c;却一半精力耗在切号、查数据、盯…

作者头像 李华