Makefile 的基本概念

Makefile 是 make 工具的配置文件,主要用于定义如何构建和管理项目的编译过程。Makefile 是 C/C++ 编译项目中的重要工具,尤其在多文件、多模块的项目中,为了方便复杂项目的管理,可以通过自动化规则提高编译效率。 这篇文章是 Makefile 的入门教程的介绍,包括其基本语法、常用功能、以及实际使用中的高级技巧。 Makefile 的基本概念 安装 make: sudo apt-get update sudo apt-get install make 核心功能 自动化编译:根据文件的依赖关系自动决定哪些文件需要重新编译。 提高效率:只编译发生变化的部分。 多任务支持:可以定义清理、打包、测试等任务。 使用方法 运行make命令时,默认会读取当前目录下的Makefile 文件。 make # 执行默认的目标 make <target> # 执行指定的目标 例如: make clean # 执行 "clean" 目标 Makefile 的基本语法 1. 目标语法 Makefile 的基本语法如下: target: prerequisites commands target:目标文件或命令名称。例如可执行文件、目标文件或任务名称。 prerequisites:依赖文件或其他目标。只有依赖文件发生变化时,target 才会被重新生成。 commands:生成目标的命令(必须以 Tab 开头)。 示例: hello: hello.o gcc -o hello hello.o hello.o: hello.c gcc -c hello.c 在示例代码中: ...

June 10, 2026

一些网站

为什么Lisp语言如此先进? 一个前辈的官网

June 10, 2026

网络协议栈(Network)

现代操作系统的内核(如 Linux 内核)中有一个专门的模块叫做: 网络协议栈(Network Stack) 主要职责详解 职责 类比说明 技术术语 1. 接收和发送数据包 公司前台接收快递 & 发送包裹 数据链路层、IP 层、传输层 2. IP 地址管理 给每个员工分配邮箱地址 IPv4 / IPv6 地址配置 3. 路由选择 快递要走哪条路线最短最快 路由表(Routing Table) 4. 封装与解封装 包裹加标签 / 拆标签 数据封装(Encapsulation)与解封装(Decapsulation) 5. 传输控制(TCP) 控制文件是否完整送达 TCP 流量控制、拥塞控制 6. 端口号管理 不同部门接收不同类型的快递 端口绑定、监听、转发 7. 安全防护(防火墙) 保安检查包裹内容 Netfilter / iptables / nftables 8. NAT 转换 公司统一出口代理 Network Address Translation 9. 域名解析支持 内部电话簿查询联系方式 DNS 解析缓存、本地 hosts 10. 支持多种协议 公司支持各种沟通方式(电话、邮件、视频会议) 支持 TCP、UDP、ICMP、HTTP、HTTPS、FTP 等 类比图:操作系统网络部门的组织架构 小组 类比角色 职责 套接字接口组(Socket Layer) 客户接待员 接收进程请求(如浏览器访问网页) 传输组(TCP / UDP) 快递打包组 控制可靠传输或快速发送 网络组(IP 层) 邮政分拣中心 决定发往哪个城市(IP 地址) 链路组(MAC 层) 快递站 决定发给哪个局域网内的目标主机 路由组(Routing) 导航调度中心 选择最优路径(下一跳) 设备驱动组(NIC Driver) 快递员 实际把包裹送出去(通过网卡) 安全组(Netfilter / Firewall) 保安检查岗 检查是否允许通行 NAT 组 公司代理出口 统一管理内部员工对外通信 DNS 缓存组 内部电话簿管理员 记录域名与 IP 的对应关系 Linux 的网络部分是一个庞大的子系统,主要包括以下几个关键模块: ...

June 10, 2026

编程的一些问题

char类型与int一样,也可以存储数字,不过只能存一个字节,多于一个字节的数,只取最右边的; 用’ ‘括起来的数字,相当于ascll中的字符, 值大小等于ascll值. 例如 ‘5’ == (int) 53 。 当要将整型数字赋值给char字符串时, 要用 str[i] =number + '0'; 或者用 sprintf(str*, "%d", number); //sprintf 函数 数组初始化{0}时,并不是全赋值为零,而是’\0’,而但他是ascll的第0位,所以%d输入时为0;但用%c时不会输出 char * p = "abc";//abc是常量,p指向"abc",不能更改 char arr[] = "abc";//将abc赋值到arr所指的地方,而arr是变量,可以更改