惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Y
Y Combinator Blog
F
Fortinet All Blogs
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
博客园 - Franky
T
The Blog of Author Tim Ferriss
D
DataBreaches.Net
量子位
博客园 - 三生石上(FineUI控件)
I
InfoQ
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
D
Docker
美团技术团队
雷峰网
雷峰网
U
Unit 42
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理

博客园 - 海乐学习

VS2026创建.net8的控制台程序并能在银河麒麟V10的Liunx上运行 在麒麟系统中卸载RabbitMQ Java Maven 开发的常用命令 C语言开发的常用命令 三汇Linux配置Config说明 Java实现优雅的关闭程序并执行清理流程的写法 C语言开发中优雅的关闭程序并执行清理流程的写法 将C语言开发的程序做成 麒麟系统的服务(Systemd 标准服务,Linux 通用) 实现开机自启动 ZeroMQ的DEALER双帧结构(路由空帧 + 业务帧)(支持异步收发、主动推送事件)C写服务端 java写客户端 ZeroMQ中ZMQ_DEALER单帧数据(支持异步收发、主动推送事件)C写服务端 java写客户端 win10系统中 关闭专注助手 执行 xx.sh 脚本文件时出现: /bin/bash^M:解释器错误: 没有那个文件或目录 运行编译打包好的 xxx.jar 中没有主清单属性 出现这个错误 将Java编译的 .jar文件做成 麒麟系统的服务(Systemd 标准服务,Linux 通用) 实现开机自启动 将Java编译的 .jar文件做成windows服务 实现开机自启动 方法二 RabbitMQ在麒麟系统中离线安装说明 VMware启动虚似机后出现 无法获取快照信息: 锁定文件失败 模块“Snapshot”启动失败。未能启动虚拟机。 C语言在Linux中开发完整Demo包含读配置文件写日志和定时器Timer C语言在Linux中开发读取配置文件app.conf 麒麟V10 Server系统中搭建C语言开发环境 麒麟ServerV10 修改IP4地址 麒麟ServerV10 配置IP4 当系统中有两个版本的Maven时,用IDEA创建Maven有时会出错 麒麟ServerV10安装 espeak-ng 和 ffmpeg 方法 C语言在Linux中开发没有界面纯后台运行的Demo程序(含日志和Timer) C语言在Linux中开发使用定时器Timer在界面上显示时间 C语言在Linux中开发带界面的程序(含每小时日志) 在apache-maven项目中使用log4写日志 在apache-maven项目中解决中文乱码问题 在apache-maven项目中读取配置文件
C语言在Linux中开发第一个项目Hello Word
海乐学习 · 2026-04-20 · via 博客园 - 海乐学习

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

image

 分别创建两个文件

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。
#================================================

清理且编译

编译后出现两个文件

image

 执行

效果

image