Linux应用开发
Linux应用开发
1. 开始前的准备
1.1 安装nfs服务器
NFS(Network File System,网络文件系统) 是一种分布式文件系统协议,由 Sun Microsystems(现 Oracle) 开发,允许计算机通过网络共享文件和目录,就像访问本地存储一样。
1.1.1 nfs 服务器端的配置
(1) 安装nfs
sudo apt install nfs-kernel-server
(2) 创建共享目录并设置权限
sudo mkdir -p /home/lv/linux/nfs # 替换为你的实际路径
sudo chown nobody:nogroup /home/lv/linux/nfs # 允许客户端访问
sudo chmod 777 /home/lv/linux/nfs # 临时测试用,生产环境应细化权限
(3) 配置 /etc/exports
sudo nano /etc/exports
添加以下内容(允许 192.168.3.0/24
网段访问):
/home/lv/linux/nfs 192.168.3.0/24(rw,sync,no_subtree_check)
-
rw
:可读可写 -
sync
:同步写入(更安全) -
no_subtree_check
:提高性能
(4) 应用配置并重启 NFS 服务
sudo exportfs -ra # 重新加载 exports
sudo systemctl restart nfs-kernel-server
(5) 检查 NFS 共享是否生效
showmount -e localhost
预期输出:
Export list for localhost:
/home/lv/linux/nfs 192.168.3.0/24
(6) 防火墙放行(如有)
sudo ufw allow from 192.168.3.0/24 to any port nfs
sudo ufw enable
sudo ufw status # 确认规则已添加
1.1.2 客户端配置
(1) 安装 NFS 客户端
sudo apt update
sudo apt install nfs-common
(2) 创建挂载点
sudo mkdir -p /mnt/nfs
(3) 手动挂载 NFS 共享
sudo mount -t nfs 192.168.3.32:/home/lv/linux/nfs /mnt/nfs
- 如果失败,尝试指定
vers=4
:bash sudo mount -t nfs4 192.168.3.32:/home/lv/linux/nfs /mnt/nfs
(4) 测试写入
touch /mnt/nfs/testfile
ls /mnt/nfs # 检查是否创建成功
1.2 安装交叉编译工具链
2.Makefile
2.1GCC
下面是 GCC(GNU Compiler Collection)在日常开发中常用的编译指令参数和功能介绍,适用于编译 C/C++ 项目,尤其在嵌入式开发(如 FreeRTOS + STM32)或普通 Linux 开发中都非常实用。
gcc [选项] 源文件.c -o 输出文件
例:
gcc main.c -o main
2.1.1 常用 GCC 编译参数分类
- 编译阶段控制
参数 | 说明 |
---|---|
-c |
只编译,不链接,生成 .o 目标文件 |
-S |
生成汇编代码 |
-E |
仅预处理,输出预处理后的代码(.i ) |
gcc -c main.c # 生成 main.o
gcc -S main.c # 生成 main.s(汇编)
gcc -E main.c -o main.i # 仅预处理
- 输出控制
参数 | 说明 |
---|---|
-o 文件名 |
指定输出文件名 |
-Wall |
开启常用警告信息 |
-Werror |
将所有警告视为错误 |
- 优化选项
参数 | 说明 |
---|---|
-O0 |
无优化(默认) |
-O1 |
基本优化 |
-O2 |
常用优化(推荐) |
-O3 |
最大优化(更激进,可能增大代码体积) |
-Os |
为减小代码尺寸而优化(嵌入式开发常用) |
- 调试 & 分析
参数 | 说明 |
---|---|
-g |
生成调试信息(可用 GDB 调试) |
-pg |
支持 gprof 性能分析 |
- 宏定义与包含
参数 | 说明 |
---|---|
-I目录 |
添加头文件搜索路径 |
-D宏名=值 |
定义宏,等同于 #define 宏 值 |
-include 文件 |
强制包含某个头文件 |
例:
gcc -I./include -DDEBUG=1 main.c -o main
- 链接控制
参数 | 说明 |
---|---|
-L目录 |
添加库搜索路径 |
-l库名 |
链接某个库(如 -lm 链接 math 库) |
-static |
使用静态链接(无需依赖动态库) |
例:
gcc main.o -L./libs -lmylib -o main
示例:完整编译流程
# 编译阶段(目标文件)
gcc -c main.c -I./include -O2 -Wall -g -o main.o
# 链接阶段
gcc main.o -L./libs -lmylib -o app
小贴士(嵌入式开发相关)
- 使用
arm-none-eabi-gcc
替代gcc
可用于 STM32 等 ARM Cortex-M 平台。 - 常与
Makefile
或CMake
配合使用自动化构建。
2.2 Makefile
2.2.1 Makefile简介
Makefile
是用于指导 make
工具自动化构建项目的脚本文件,广泛应用于 C/C++、嵌入式开发中。它定义了各类文件的依赖关系与编译命令,从而简化重复性编译操作,避免“全量编译”。
主要功能:
- 自动化编译(增量构建)
- 管理源文件、头文件依赖关系
- 定义清晰的编译规则和目标
基本结构:
目标: 依赖
[TAB] 编译命令
示例:
main.o: main.c main.h
gcc -c main.c -o main.o
2.2.2 Makefile常用规则
下面是构建一个 C 项目常用的规则与语法:
① 变量定义
CC = gcc
CFLAGS = -Wall -O2
SRC = main.c utils.c
OBJ = $(SRC:.c=.o)
TARGET = app
② 伪目标(如 all、clean)
.PHONY: all clean
all: $(TARGET)
clean:
rm -f $(OBJ) $(TARGET)
③ 构建目标程序
$(TARGET): $(OBJ)
$(CC) $(OBJ) -o $@
④ 自动化生成 .o
文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
说明:
$@
:目标名(如 main.o)$<
:第一个依赖文件(如 main.c)$^
:所有依赖文件
⑤ 示例完整 Makefile
CC = gcc
CFLAGS = -Wall -O2
SRC = main.c utils.c
OBJ = $(SRC:.c=.o)
TARGET = app
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJ)
$(CC) $(OBJ) -o $@
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJ) $(TARGET)