
🚀 欢迎来到《Linux系统实战》! 这里是命令行到内核的跃迁基地,也是你从"rm -rf恐惧症"到"权限管理大师"的修炼场。
🔍 专栏特色:
💡 学习建议: 1️⃣ 先动手尝试(搞崩了也没关系) 2️⃣ 对照文章分析原理 3️⃣ 用文末【实战任务】巩固技能
📌 Linux经典名言:
“Linux不是背出来的,是在一次次Permission denied中练出来的!”
(正文开始👇)
gcc和g++分别是GNU的C和C++的编译器,gcc和g++在执行编译的时候一般有以下四个步骤: 1)预处理(头文件展开、去注释、宏替换、条件编译)。 2)编译(C代码翻译成汇编语言)。 3)汇编(汇编代码转为二进制目标代码)。 4)链接(将汇编过程产生的二进制代码进行链接)。
选项 | 功能说明 | 备注 |
|---|---|---|
-E | 只进行预处理,不生成文件 | 需手动重定向到输出文件(如 gcc -E test.c > test.i) |
-S | 编译到汇编语言(生成 .s 文件),不进行汇编和链接 | 保留预处理 + 编译结果 |
-c | 编译到目标代码(生成 .o 文件),不链接 | 适用于分步编译 |
-o <file> | 指定输出文件名 | 如 gcc test.c -o test |
-static | 强制静态链接(生成文件较大) | 优先链接静态库而非动态库 |
-g | 生成调试信息(GDB 可用) | 默认生成 release 版本需显式添加此选项 |
-shared | 生成动态链接库(.so 文件) | 通常配合 -fPIC 使用 |
-w | 禁用所有警告信息 | 不推荐使用(可能掩盖潜在问题) |
-Wall | 开启所有标准警告信息 | 实际不包括所有警告(建议结合 -Wextra) |
-O0 | 不优化(调试时推荐) | 保留原始代码结构 |
-O1 | 基础优化(默认级别) | 在编译速度和性能间平衡 |
-O2 | 深度优化(推荐发布使用) | 包含大多数安全优化选项 |
-O3 | 激进优化(可能增加代码体积) | 可能改变程序行为(需严格测试) |
小技巧:
g++ -Wall -O2 -g main.cpp -o appgcc --help 或 man gccgcc和g++的执行步骤中的指令都是相同的,这里小编以linux中的gcc编译器的执行步骤中的指令为例进行讲解
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。


gcc -S code.i -o code.sgcc -S 要进行编译的文件名(建议使用预处理后以 .i 为后缀的文件) -o 编译后的文件名(这里建议使用 .s 为后缀),即告诉编译器从现在开始进行翻译,当编译工作完成后,就停下来


gcc -c code.s -o code.0gcc -c 要进行汇编的文件名(这里建议使用编译后的.s文件) -o 汇编后的文件名(这里建议使用.o为后缀的文件名),告诉编译器开始进行程序的翻译,当汇编工作完成后,就停下来


gcc code.o -o codegcc 要进行链接的文件(这里建议使用执行完汇编后生成的.o文件) -o 链接后的文件名,将编译生成的可重定位目标二进制文件(目标文件)和库进行链接生成可执行程序


注意: 链接后生成的也是二进制文件。
./可执行文件名,即可执行可执行文件

动态库
# 安装运行时库(仅动态库,无头文件)
sudo yum install curl
# 安装开发包(包含头文件和动态库链接)
sudo yum install libcurl-devel
静态库
yum install glibc-static libstdc++-static -y
方法的实现其实就在库中 库其实是将源文件经过翻译,打包成为一个文件(不用提供太多的源文件,也达到了隐藏源文件的目的),库避免了一些经常性使用的函数实现的重复书写,节省工作,提高效率 你的软件=头文件提供声明+库提供函数的实现+你的代码
库分为动态库(共享库)和静态库,那么对应有动态链接和静态链接 动态链接:
ldd 可执行程序 可以查看或打印一个程序运行所需的共享库

观察一下静态链接方式由于是将库进行拷贝,所以占用空间明显大于动态链接(程序执行时由运行的链接文件进行加载库)方式


以下是符合 CSDN 博客风格的 Markdown 表格,对比动态库和静态库的优缺点,并优化了可读性和技术专业性:
特性 | 动态库(.so/.dll) | 静态库(.a/.lib) |
|---|---|---|
🔧 编译方式 | 编译时记录依赖,运行时加载 | 编译时直接嵌入到可执行文件中 |
📦 文件体积 | ✅ 极小(仅记录符号)• 多个程序共享同一份库文件 | ❌ 巨大(库代码直接复制到程序)• 每个程序都包含完整库代码 |
🏃 运行依赖 | ❌ 必须存在• 缺失时报错:error while loading shared libraries | ✅ 完全独立• 单文件即可运行 |
🔄 更新维护 | ✅ 热更新• 替换 .so 文件立即生效 | ❌ 需重新编译• 修复库=重新发布所有程序 |
⚡ 运行性能 | ⚠️ 略慢(首次加载需解析符号) | ✅ 极致快(无运行时链接开销) |
💣 兼容性 | ❌ 地狱级难题• glibc 版本冲突常见 | ✅ 无烦恼• 库和程序成绑定关系 |
🛡️ 安全性 | ⚠️ 有风险• 可能被恶意替换成钓鱼库 | ✅ 铁布衫• 代码全内嵌防篡改 |
🚀 适用场景 | • 桌面应用(如WPS)• 微服务容器• 插件系统(如Nginx模块) | • 嵌入式设备• 路由器固件• 安全敏感工具(如tcpdump) |
💻 部署难度 | ❌ 需处理依赖树• LD_LIBRARY_PATH/rpath 配置复杂 | ✅ 双击即用• 无环境依赖 |