手把手教你Linux 打包压缩与 gcc 编译详解

张开发
2026/4/19 2:01:30 15 分钟阅读

分享文章

手把手教你Linux 打包压缩与 gcc 编译详解
引言在 Linux 系统中文件打包压缩和程序编译是两项必备技能。打包压缩让你能够高效地管理和传输文件而理解编译过程则帮助你深入理解程序从源代码到可执行文件的完整旅程。今天我将通过详细的命令示例和底层原理讲解带你掌握 tar/gzip 的使用和 GCC 编译的四个阶段。第一部分文件打包与压缩一、为什么需要打包压缩场景需求软件发布将多个文件/目录打包成一个文件网络传输减小文件体积节省带宽备份归档将分散的文件整合保存源码分发Linux内核、开源软件都使用 tar.gz 格式二、tar 命令——打包与解包1. 打包操作只打包不压缩# 基本语法 tar cvf 包名.tar 文件1 文件2 ... # 参数说明 # c创建新包create # v显示详细过程verbose # f指定普通文件file # 示例将三个文件打包 tar cvf my.tar file main.c passwd # 输出 # file # main.c # passwd # 打包后原文件仍保留需要可手动删除打包的内存理解2. 解包操作# 基本语法 tar xvf 包名.tar # 参数说明 # x从包中释放文件extract # v显示详细过程 # f指定普通文件 # 示例解包 my.tar tar xvf my.tar # 输出 # file # main.c # passwd实用技巧解包时会覆盖同名文件建议先确认或备份解包后保留原 tar 包可重复使用三、gzip 命令——压缩与解压1. 压缩操作# 基本语法 gzip 文件名.tar # 效果将 tar 包压缩为 .tar.gz 格式 # 压缩后体积显著减小通常能减少 60%-80% # 示例压缩 my.tar gzip my.tar # 生成my.tar.gz原 my.tar 被替换 # 常见场景 # - 网络下载的软件包libevent-2.1.12-stable.tar.gz # - Linux内核源码linux-6.1.tar.gz压缩效果对比文件大小说明my.tar10 MB打包后my.tar.gz2.5 MBgzip压缩后2. 解压操作两种方式# 方式1一步解压法推荐 tar zxf 压缩包名.tar.gz # 参数 z启用 gzip 解压功能 # 示例 tar zxf my.tar.gz # 方式2分步解压法 # 第一步解压得到 .tar 文件 gzip -d my.tar.gz # 或 gunzip my.tar.gz # 第二步解包 tar xvf my.tar # 实用建议推荐使用一步法 tar zxf效率更高方法一方法二四、其他压缩格式格式压缩命令解压命令.tar.gztar zcvftar zxf.tar.bz2tar jcvftar jxf.tar.xztar Jcvftar Jxf.zipzip -runzip# 打包并压缩一步完成最常用 tar zcvf archive.tar.gz dir/ # 参数组合 # zgzip压缩 # c创建包 # v显示过程 # f指定文件 # 示例将 src 目录打包压缩 tar zcvf src_backup.tar.gz src/第二部分GCC 编译过程详解一、编译的四个阶段源代码 (.c) │ ▼ ┌─────────────┐ │ 1. 预处理 │ gcc -E │ 展开宏、 │ │ 处理#include│ └─────────────┘ │ ▼ (.i 文件) │ ▼ ┌─────────────┐ │ 2. 编译 │ gcc -S │ 语法检查 │ │ 生成汇编 │ └─────────────┘ │ ▼ (.s 文件) │ ▼ ┌─────────────┐ │ 3. 汇编 │ gcc -c │ 转换为 │ │ 机器指令 │ └─────────────┘ │ ▼ (.o 文件) │ ▼ ┌─────────────┐ │ 4. 链接 │ gcc │ 合并文件 │ │ 链接库 │ └─────────────┘ │ ▼ 可执行文件二、阶段1预处理Preprocessing任务展开所有宏定义#define MAX 10→10删除所有注释//和/* */处理#include指令将被包含文件内容插入添加行号和文件名标识用于调试保留#pragma编译器指令# 命令格式 gcc -E main.c -o main.i # 示例 gcc -E hello.c -o hello.i # 查看预处理结果 cat hello.i # 现象 # - stdio.h 被展开可能多达800多行 # - 宏被替换 # - 注释被删除预处理前后对比// hello.c源代码约50行 #include stdio.h #define MAX 10 int main() { int arr[MAX]; // 这是一个注释 printf(Hello\n); return 0; }mian.i三、阶段2编译Compilation任务进行语法和语义检查此阶段才会报语法错误将预处理后的代码转换为汇编代码# 命令格式 gcc -S main.i -o main.s # 示例 gcc -S hello.i -o hello.s # 查看汇编代码 cat hello.s汇编代码示例x86_64main: pushq %rbp movq %rsp, %rbp subq $48, %rsp movl $10, -4(%rbp) leaq .LC0(%rip), %rdi call putsPLT movl $0, %eax leave ret特点汇编代码与机器指令几乎一一对应不同 CPU 体系结构需要不同的汇编代码。四、阶段3汇编Assembly任务将汇编代码转换为机器指令二进制# 命令格式 gcc -c main.s -o main.o # 示例 gcc -c hello.s -o hello.o # 查看二进制文件十六进制 hexdump -C hello.o | head -20文件格式Linux.o文件ELF 格式Windows.obj文件PE 格式二进制内容示例00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 01 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 |...............| 00000020 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |...............| ...五、阶段4链接Linking任务将多个目标文件合并链接库函数如printf的实现生成最终的可执行文件# 命令格式 gcc main.o -o main # 示例 gcc hello.o -o hello # 直接编译链接一步完成 gcc hello.c -o hello链接的本质文件大小对比文件大小说明hello.c150 B源代码hello.i800 行预处理后hello.s约 50 行汇编代码hello.o1.4 KB目标文件hello16 KB可执行文件链接库后六、完整编译流程示例# 创建一个简单的C程序 cat test.c EOF #include stdio.h #define MSG Hello int main() { printf(%s, World!\n, MSG); return 0; } EOF # 1. 预处理 gcc -E test.c -o test.i # 2. 编译 gcc -S test.i -o test.s # 3. 汇编 gcc -c test.s -o test.o # 4. 链接 gcc test.o -o test # 运行 ./test # 输出Hello, World! # 一步到位 gcc test.c -o test第三部分库函数与头文件的关系一、声明与实现分离// 头文件声明stdio.h // 位置/usr/include/stdio.h int printf(const char *format, ...); // 库文件实现libc.so // 位置/lib/x86_64-linux-gnu/libc.so.6 // 包含 printf 的实际二进制代码工作流程二、常用库的链接选项库链接选项说明C标准库默认链接printf、scanf等数学库-lmsqrt、sin、cos、pow线程库-lpthreadpthread_create等实时库-lrt定时器、共享内存# 使用数学库需要显式链接 gcc math.c -o math -lm # 使用线程库 gcc thread.c -o thread -lpthread第四部分知识小结一、打包压缩命令速查操作命令说明打包tar cvf out.tar file1 file2仅打包不压缩解包tar xvf out.tar释放打包文件gzip压缩gzip file.tar压缩为 .tar.gzgzip解压gzip -d file.tar.gz解压为 .tar一步压缩tar zcvf out.tar.gz dir/打包压缩一步解压tar zxf out.tar.gz解压解包二、GCC编译阶段速查阶段命令输入输出主要任务预处理gcc -E.c.i展开宏、处理头文件编译gcc -S.i.s语法检查、生成汇编汇编gcc -c.s.o转换为机器指令链接gcc.o可执行文件合并文件、链接库三、参数汇总参数作用使用阶段-E只预处理预处理-S生成汇编代码编译-c只汇编不链接汇编-o指定输出文件名所有阶段-I指定头文件路径预处理-L指定库文件路径链接-l链接指定库链接-g生成调试信息编译-O2优化级别2编译打包压缩和程序编译是 Linux 开发中的基础技能。打包压缩核心tar负责打包多个文件变一个gzip负责压缩大文件变小tar zcvf和tar zxf是最常用的组合编译过程核心预处理 → 编译 → 汇编 → 链接语法错误在编译阶段报出链接错误通常是找不到函数实现

更多文章