banner
NEWS LETTER

Linux 应用开发入门

Scroll down

一、Linux 应用开发是什么

Linux 应用开发通常指在 Linux 系统上编写、编译、调试、运行和发布用户态程序。它和 Android、嵌入式、服务端开发都有交集,但核心基础基本一致:

  • 熟悉 Linux 文件系统、权限、进程、线程、信号、网络等机制。
  • 能使用 GCC、Make、CMake 等工具构建程序。
  • 能使用 GDB、strace、lsof、top、journalctl 等工具定位问题。
  • 能理解动态库、静态库、环境变量、系统调用和进程通信。
  • 能把程序打包、部署,并在目标环境中稳定运行。

Linux 下既可以开发命令行工具,也可以开发后台服务、网络程序、桌面应用、驱动配套工具、嵌入式应用等。入门阶段建议从命令行程序和后台服务开始,因为它们能覆盖最多基础能力。

二、开发环境准备

2.1 选择发行版

常见选择:

  • Ubuntu / Debian:资料多,适合入门和服务器开发。
  • Fedora:软件较新,适合跟进新工具链。
  • CentOS Stream / Rocky Linux / AlmaLinux:偏企业服务器环境。
  • Arch Linux:滚动更新,适合熟悉 Linux 后使用。

如果是新手,建议使用 Ubuntu LTS。

2.2 安装基础工具

Ubuntu / Debian:

1
2
sudo apt update
sudo apt install -y build-essential gcc g++ make cmake gdb git pkg-config

Fedora:

1
2
sudo dnf groupinstall -y "Development Tools"
sudo dnf install -y gcc gcc-c++ make cmake gdb git pkgconf-pkg-config

检查版本:

1
2
3
4
5
6
gcc --version
g++ --version
make --version
cmake --version
gdb --version
git --version

2.3 推荐编辑器

常见选择:

  • VS Code:配合 Remote SSH、C/C++ 插件、CMake Tools,入门友好。
  • Vim / Neovim:适合终端开发。
  • CLion:C/C++ 项目体验好,但需要授权。
  • Qt Creator:适合 Qt 桌面应用。

入门阶段可以使用 VS Code,等熟悉终端工具后再逐步增加 Vim、tmux 等工具。

三、第一个 C 程序

创建文件:

1
2
3
mkdir linux-demo
cd linux-demo
touch hello.c

写入代码:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(int argc, char *argv[]) {
printf("Hello Linux app development\n");
printf("argc = %d\n", argc);

for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}

return 0;
}

编译:

1
gcc hello.c -o hello

运行:

1
./hello a b c

输出类似:

1
2
3
4
5
6
Hello Linux app development
argc = 4
argv[0] = ./hello
argv[1] = a
argv[2] = b
argv[3] = c

这里需要注意:

  • ./hello 表示运行当前目录下的可执行文件。
  • Linux 默认不会从当前目录搜索命令,所以不能直接输入 hello
  • argc 是参数个数。
  • argv 是参数数组。

四、编译基础

4.1 GCC 常用参数

1
gcc main.c -o app

含义:

  • main.c:源文件。
  • -o app:输出可执行文件名。

常用参数:

1
gcc main.c -o app -Wall -Wextra -g

说明:

  • -Wall:开启常见警告。
  • -Wextra:开启更多警告。
  • -g:生成调试信息,方便 GDB 调试。

优化编译:

1
gcc main.c -o app -O2

开发阶段建议使用:

1
gcc main.c -o app -Wall -Wextra -g

发布阶段再考虑:

1
gcc main.c -o app -O2

4.2 编译多个文件

目录:

1
2
3
4
linux-demo/
├── main.c
├── math_utils.c
└── math_utils.h

math_utils.h

1
2
3
4
5
6
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b);

#endif

math_utils.c

1
2
3
4
5
#include "math_utils.h"

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

main.c

1
2
3
4
5
6
7
#include <stdio.h>
#include "math_utils.h"

int main(void) {
printf("1 + 2 = %d\n", add(1, 2));
return 0;
}

编译:

1
gcc main.c math_utils.c -o app -Wall -Wextra -g

五、使用 Makefile

文件少的时候可以直接用 gcc,文件多了以后建议使用 Makefile。

创建 Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CC := gcc
CFLAGS := -Wall -Wextra -g
TARGET := app
SRCS := main.c math_utils.c
OBJS := $(SRCS:.c=.o)

all: $(TARGET)

$(TARGET): $(OBJS)
$(CC) $(OBJS) -o $(TARGET)

%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@

clean:
rm -f $(TARGET) $(OBJS)

注意:Makefile 的命令行前面必须是 Tab,不是空格。

编译:

1
make

清理:

1
make clean

重新编译:

1
2
make clean
make

六、使用 CMake

CMake 更适合跨平台和中大型项目。

目录:

1
2
3
4
5
linux-demo/
├── CMakeLists.txt
├── main.c
├── math_utils.c
└── math_utils.h

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cmake_minimum_required(VERSION 3.16)

project(linux_demo C)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)

add_executable(app
main.c
math_utils.c
)

target_compile_options(app PRIVATE
-Wall
-Wextra
)

构建:

1
2
cmake -S . -B build
cmake --build build

运行:

1
./build/app

清理构建目录:

1
rm -rf build

实际项目中推荐使用 out-of-source build,也就是把构建产物放到 build 目录,避免污染源码目录。

七、调试程序

7.1 使用 GDB

编译时带上 -g

1
gcc main.c math_utils.c -o app -Wall -Wextra -g

启动调试:

1
gdb ./app

常用命令:

1
2
3
4
5
6
7
8
break main
run
next
step
print variable_name
backtrace
continue
quit

说明:

  • break main:在 main 函数打断点。
  • run:开始运行。
  • next:执行下一行,不进入函数。
  • step:执行下一行,进入函数。
  • print:打印变量。
  • backtrace:查看调用栈。
  • continue:继续运行。
  • quit:退出。

7.2 调试崩溃

程序段错误:

1
Segmentation fault (core dumped)

可以开启 core dump:

1
ulimit -c unlimited

重新运行程序,生成 core 文件后调试:

1
gdb ./app core

在 GDB 中查看调用栈:

1
backtrace

7.3 使用 strace

strace 可以查看程序调用了哪些系统调用。

安装:

1
sudo apt install -y strace

使用:

1
strace ./app

查看文件访问:

1
strace -e openat ./app

保存日志:

1
strace -o trace.log ./app

如果程序提示文件不存在、权限不足、网络连接失败,strace 很有用。

八、Linux 文件和权限

8.1 常见目录

1
2
3
4
5
6
7
8
/bin        基础命令
/usr/bin 普通用户命令
/usr/lib 库文件
/etc 配置文件
/var/log 日志文件
/tmp 临时文件
/home 用户目录
/proc 进程和内核信息

应用开发中常见路径:

  • 配置文件:/etc/your_app/
  • 日志文件:/var/log/your_app/
  • 数据文件:/var/lib/your_app/
  • 可执行文件:/usr/bin/your_app/usr/local/bin/your_app

8.2 权限

查看权限:

1
ls -l

示例:

1
-rwxr-xr-x 1 user user 12345 Jun 21 10:00 app

含义:

  • r:读。
  • w:写。
  • x:执行。
  • 第一组:文件所有者权限。
  • 第二组:所属组权限。
  • 第三组:其他用户权限。

给程序增加执行权限:

1
chmod +x app

九、进程、线程和信号

9.1 查看进程

1
2
3
ps aux | grep app
top
htop

查看某个进程打开的文件:

1
lsof -p <pid>

查看端口占用:

1
ss -lntp

9.2 信号

Linux 通过信号通知进程发生了某些事件。

常见信号:

  • SIGINT:终端 Ctrl+C。
  • SIGTERM:请求进程正常退出。
  • SIGKILL:强制杀死进程,不能被捕获。
  • SIGHUP:终端断开或请求重新加载配置。

结束进程:

1
kill <pid>

强制结束:

1
kill -9 <pid>

开发后台服务时,应该优先处理 SIGTERM,收到后释放资源并正常退出。

十、日志和配置

10.1 日志

入门阶段可以先打印到标准输出:

1
2
3
4
5
6
7
#include <stdio.h>

int main(void) {
fprintf(stdout, "info: app started\n");
fprintf(stderr, "error: something failed\n");
return 0;
}

后台服务建议输出结构化日志,至少包含:

  • 时间。
  • 日志级别。
  • 模块名。
  • 错误码。
  • 关键参数。

示例:

1
2
2026-06-21 10:00:00 INFO server started port=8080
2026-06-21 10:01:12 ERROR connect database failed code=111

10.2 配置

常见配置方式:

  • 命令行参数。
  • 环境变量。
  • 配置文件。

命令行参数适合一次性指定:

1
./app --port 8080 --config ./app.conf

环境变量适合部署环境差异:

1
APP_ENV=prod ./app

配置文件适合长期配置:

1
2
3
port=8080
log_level=info
data_dir=/var/lib/my_app

十一、动态库和静态库

11.1 静态库

生成目标文件:

1
gcc -c math_utils.c -o math_utils.o

打包静态库:

1
ar rcs libmathutils.a math_utils.o

链接:

1
gcc main.c -L. -lmathutils -o app

11.2 动态库

编译动态库:

1
gcc -fPIC -shared math_utils.c -o libmathutils.so

链接:

1
gcc main.c -L. -lmathutils -o app

运行前指定库路径:

1
LD_LIBRARY_PATH=. ./app

查看程序依赖了哪些动态库:

1
ldd ./app

如果出现 not found,说明动态库搜索路径不正确。

十二、网络应用入门

Linux 网络应用常见方向:

  • TCP 服务端。
  • HTTP 服务。
  • WebSocket 服务。
  • 本地 Unix Domain Socket。
  • 客户端工具。

入门建议先理解:

  • IP 和端口。
  • TCP 和 UDP。
  • socket API。
  • 阻塞和非阻塞 IO。
  • select / poll / epoll。

查看监听端口:

1
ss -lntp

测试 TCP 连接:

1
nc 127.0.0.1 8080

请求 HTTP 服务:

1
curl http://127.0.0.1:8080

网络程序排错常用工具:

  • curl:测试 HTTP。
  • nc:测试 TCP / UDP。
  • ss:查看端口。
  • tcpdump:抓包。
  • strace:看系统调用。

十三、后台服务和 systemd

如果程序需要开机启动、异常重启、统一日志管理,可以使用 systemd。

示例服务文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=My Linux App
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/my_app --config /etc/my_app/app.conf
Restart=on-failure
User=myapp
Group=myapp

[Install]
WantedBy=multi-user.target

保存为:

1
/etc/systemd/system/my_app.service

加载:

1
sudo systemctl daemon-reload

启动:

1
sudo systemctl start my_app

设置开机启动:

1
sudo systemctl enable my_app

查看状态:

1
systemctl status my_app

查看日志:

1
journalctl -u my_app -f

十四、打包和发布

14.1 简单发布

小工具可以直接发布可执行文件:

1
scp ./app user@server:/usr/local/bin/app

远端增加执行权限:

1
chmod +x /usr/local/bin/app

14.2 发布目录结构

更完整的发布结构:

1
2
3
4
5
6
7
8
my_app/
├── bin/
│ └── my_app
├── conf/
│ └── app.conf
├── lib/
│ └── libxxx.so
└── README.md

压缩:

1
tar -czf my_app.tar.gz my_app/

解压:

1
tar -xzf my_app.tar.gz

14.3 Debian 包

如果面向 Ubuntu / Debian 系统,后续可以学习 .deb 打包。入门阶段不必一开始就做包管理,先保证程序能稳定构建、运行、停止、重启、查看日志。

十五、常见问题

15.1 Permission denied

可能原因:

  • 文件没有执行权限。
  • 当前用户没有访问目录权限。
  • 程序访问了需要 root 权限的资源。

检查:

1
ls -l app

处理:

1
chmod +x app

15.2 command not found

可能原因:

  • 程序不在 PATH 中。
  • 当前目录没有使用 ./

运行当前目录程序:

1
./app

查看 PATH:

1
echo $PATH

15.3 cannot open shared object file

动态库找不到。

检查:

1
ldd ./app

临时解决:

1
LD_LIBRARY_PATH=/path/to/lib ./app

长期解决:

  • 把库安装到系统库目录。
  • 配置 /etc/ld.so.conf.d/
  • 使用 rpath。
  • 发布时带上运行脚本设置库路径。

15.4 Segmentation fault

常见原因:

  • 空指针。
  • 数组越界。
  • 使用已经释放的内存。
  • 栈溢出。
  • 错误的类型转换。

排查:

1
2
gcc main.c -o app -Wall -Wextra -g
gdb ./app

15.5 端口被占用

检查端口:

1
ss -lntp | grep 8080

找到进程后决定是否关闭:

1
kill <pid>

十六、学习路线

建议按这个顺序学习:

  1. Linux 基础命令:cdlscpmvrmfindgrepsedawk
  2. Shell 基础:变量、管道、重定向、脚本、退出码。
  3. C 语言基础:指针、结构体、内存管理、文件 IO。
  4. 编译工具:GCC、Makefile、CMake。
  5. 调试工具:GDB、strace、lsof、valgrind。
  6. 系统编程:进程、线程、信号、IPC、socket。
  7. 服务化:日志、配置、systemd、权限隔离。
  8. 发布部署:压缩包、动态库依赖、deb/rpm、容器。
  9. 性能优化:top、perf、火焰图、内存分析。
  10. 工程化:单元测试、CI、代码规范、版本管理。

十七、入门项目练习

可以从这些小项目开始:

  • 写一个命令行计算器。
  • 写一个日志切分工具。
  • 写一个文件搜索工具。
  • 写一个 TCP echo server。
  • 写一个 HTTP 静态文件服务。
  • 写一个定时执行任务的小服务。
  • 写一个读取配置文件并输出日志的后台进程。

每个项目都尽量做到:

  • 支持命令行参数。
  • 有清晰的错误提示。
  • 有 README。
  • 可以使用 Makefile 或 CMake 构建。
  • 可以用 GDB 调试。
  • 可以打包发布。

十八、总结

Linux 应用开发入门不要只看语法,要尽快把程序放到真实 Linux 环境中编译、运行、调试和部署。最小闭环是:

1
写代码 -> 编译 -> 运行 -> 出错 -> 调试 -> 修复 -> 打包 -> 部署 -> 查看日志

把这个闭环跑熟之后,再深入学习网络编程、多线程、性能优化和系统服务化,Linux 应用开发的基础就比较扎实了。

其他文章
目录导航 置顶
  1. 1. 一、Linux 应用开发是什么
  2. 2. 二、开发环境准备
    1. 2.1. 2.1 选择发行版
    2. 2.2. 2.2 安装基础工具
    3. 2.3. 2.3 推荐编辑器
  3. 3. 三、第一个 C 程序
  4. 4. 四、编译基础
    1. 4.1. 4.1 GCC 常用参数
    2. 4.2. 4.2 编译多个文件
  5. 5. 五、使用 Makefile
  6. 6. 六、使用 CMake
  7. 7. 七、调试程序
    1. 7.1. 7.1 使用 GDB
    2. 7.2. 7.2 调试崩溃
    3. 7.3. 7.3 使用 strace
  8. 8. 八、Linux 文件和权限
    1. 8.1. 8.1 常见目录
    2. 8.2. 8.2 权限
  9. 9. 九、进程、线程和信号
    1. 9.1. 9.1 查看进程
    2. 9.2. 9.2 信号
  10. 10. 十、日志和配置
    1. 10.1. 10.1 日志
    2. 10.2. 10.2 配置
  11. 11. 十一、动态库和静态库
    1. 11.1. 11.1 静态库
    2. 11.2. 11.2 动态库
  12. 12. 十二、网络应用入门
  13. 13. 十三、后台服务和 systemd
  14. 14. 十四、打包和发布
    1. 14.1. 14.1 简单发布
    2. 14.2. 14.2 发布目录结构
    3. 14.3. 14.3 Debian 包
  15. 15. 十五、常见问题
    1. 15.1. 15.1 Permission denied
    2. 15.2. 15.2 command not found
    3. 15.3. 15.3 cannot open shared object file
    4. 15.4. 15.4 Segmentation fault
    5. 15.5. 15.5 端口被占用
  16. 16. 十六、学习路线
  17. 17. 十七、入门项目练习
  18. 18. 十八、总结
请输入关键词进行搜索