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=4bash 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 编译参数分类

  1. 编译阶段控制
参数 说明
-c 只编译,不链接,生成 .o 目标文件
-S 生成汇编代码
-E 仅预处理,输出预处理后的代码(.i
gcc -c main.c          # 生成 main.o
gcc -S main.c          # 生成 main.s(汇编)
gcc -E main.c -o main.i  # 仅预处理
  1. 输出控制
参数 说明
-o 文件名 指定输出文件名
-Wall 开启常用警告信息
-Werror 将所有警告视为错误
  1. 优化选项
参数 说明
-O0 无优化(默认)
-O1 基本优化
-O2 常用优化(推荐)
-O3 最大优化(更激进,可能增大代码体积)
-Os 为减小代码尺寸而优化(嵌入式开发常用)
  1. 调试 & 分析
参数 说明
-g 生成调试信息(可用 GDB 调试)
-pg 支持 gprof 性能分析
  1. 宏定义与包含
参数 说明
-I目录 添加头文件搜索路径
-D宏名=值 定义宏,等同于 #define 宏 值
-include 文件 强制包含某个头文件

例:

gcc -I./include -DDEBUG=1 main.c -o main
  1. 链接控制
参数 说明
-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 平台。
  • 常与 MakefileCMake 配合使用自动化构建。

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)