









在Linux系统创建一个文件夹名为:MyCServer

分别创建两个文件
MyCServer.c
#include <stdio.h> int main() { printf("Hello World\n"); return 0; }
Makefile
注:这个C语言的编译文件,没有扩展名
# ========================================== # 编译器与变量定义 # 原生单 *.c 文件的的编译命令 gcc MyCServer.c -o MyCServer # 有Makefile文件的 清理并编译 make clean && make # 运行 ./MyCServer # ========================================== # 定义 C 语言编译器为 gcc CC = gcc # 定义 C++ 编译器为 g++ (虽然本文件主要编译 .c,但预留变量是个好习惯) CXX = g++ # 编译选项 (CFLAGS) # -Wall : 开启几乎所有警告,帮助发现潜在代码问题 # -O2 : 开启二级优化,提高程序运行速度 # -D_XOPEN_SOURCE_EXTENDED : 宏定义,启用 X/Open 标准扩展,通常用于支持宽字符和高级终端功能 # -D_GNU_SOURCE : 宏定义,启用 GNU C 库的扩展功能,确保能使用一些非标准的系统调用 CFLAGS = -Wall -O2 -D_XOPEN_SOURCE_EXTENDED -D_GNU_SOURCE # 链接选项 (LDFLAGS) # -lpthread : 链接 pthread 库,支持多线程编程 # -lshpa3 : 链接 shpa3 库 (可能是你的私有库或特定硬件库) # -lncursesw : 链接 ncursesw 库,'w' 代表 wide-character,用于在终端支持中文和宽字符显示 # -lstdc++ : 链接 C++ 标准库 (因为可能混编了 C++ 代码或依赖库是用 C++ 写的) # -lzmq : 链接 ZeroMQ 库,用于高性能网络消息通信 LDFLAGS = -lpthread -lshpa3 -lncursesw -lstdc++ -lzmq # ========================================== # 2. 目标文件与源文件定义 # ========================================== # 最终生成的可执行文件名 #TARGET = ShPbxServer TARGET = MyCServer # 源文件列表 (所有 .c 文件) #SRCS = ShPbxServer.c Logger.c ZeroMQServer.c ShBoard.c ShMemRecord.c ZeroMQAudioPush.c SRCS = MyCServer.c # 目标文件列表 (自动将 SRCS 中的 .c 替换为 .o) # 例如: ShPbxServer.c -> ShPbxServer.o OBJS = $(SRCS:.c=.o) # ========================================== # 3. 伪目标声明 # ========================================== # 声明 .PHONY 告诉 make,all 和 clean 不是文件名,而是动作标签 # 这样可以避免当前目录下有名为 "all" 或 "clean" 的文件时产生冲突 .PHONY: all clean install uninstall # ========================================== # 4. 默认目标 # ========================================== # all 是默认执行的第一个目标,它依赖于 $(TARGET) # 执行 make 时,会先尝试构建 $(TARGET) all: $(TARGET) # ========================================== # 5. 链接规则 (生成可执行文件) # ========================================== # 规则:生成 $(TARGET) 依赖于所有的 $(OBJS) $(TARGET): $(OBJS) # 注意:下面这行开头必须是一个 Tab 键,不能是空格! # 执行链接命令:将所有的 .o 文件链接在一起,生成最终的可执行文件 $(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS) # ========================================== # 6. 编译规则 (生成 .o 文件) # ========================================== # 模式规则:告诉 make 如何将任意 .c 文件编译成 .o 文件 # % 是通配符,表示匹配任意文件名 %.o: %.c # 执行编译命令: # -c 表示只编译不链接 # $< 代表第一个依赖文件 (即源文件 .c) # $@ 代表目标文件 (即 .o 文件) $(CC) $(CFLAGS) -c $< -o $@ # ========================================== # 7. 清理规则 # ========================================== # 清理构建产物 clean: # 删除所有的 .o 中间文件和最终的可执行文件 # -f 参数表示强制删除,不提示确认 rm -f $(OBJS) $(TARGET) # ========================================== # 8. 安装与卸载 (可选) # ========================================== # 安装目标:将编译好的程序复制到系统路径,使其可以在任意目录运行 install: $(TARGET) cp $(TARGET) /usr/local/bin/ # 卸载目标:删除系统路径中的程序 uninstall: rm -f /usr/local/bin/$(TARGET) #================几个关键点解释=================== #1、-lncursesw 的作用: #你的程序中使用了 ncursesw 而不是普通的 ncurses。这说明你的程序界面需要显示中文或者特殊符号。如果编译报错找不到库,通常是因为系统没装 libncursesw-dev。 #2、$< 和 $@: #这是 Makefile 的自动变量。 #$<:代表依赖列表中的第一个文件(在这里是 .c 源文件)。 #$@:代表目标文件(在这里是 .o 对象文件)。 #使用它们可以让规则通用,不用为每个文件单独写一行编译命令。 #3、Tab 键缩进: #在 Makefile 中,所有命令(如 $(CC)... 或 rm...)前面必须使用 Tab 键 进行缩进,不能使用空格。这是新手最容易遇到的报错原因(missing separator)。 #4、$(SRCS:.c=.o): #这是一个字符串替换函数。它会自动把 SRCS 变量里所有的 .c 后缀替换成 .o,这样你添加新源文件时,只需要改 SRCS 列表,不用手动去改 OBJS。 #================================================
清理且编译
编译后出现两个文件

执行
效果

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。