GCC编译命令

以下 GCC 编译命令,涵盖常见用法,适用于 C/C++ 项目开发。

1. 基础编译命令

(1)编译单个源文件

gcc hello.c -o hello  # 编译 hello.c,生成可执行文件 hello
  • -o:指定输出文件名(默认生成 a.out)。

(2)编译并运行

gcc hello.c -o hello && ./hello  # 编译后立即执行

2. 分步编译(预处理、汇编、链接)

(1)预处理(生成 .i 文件)

gcc -E hello.c -o hello.i  # 展开宏和头文件

(2)生成汇编代码(.s 文件)

gcc -S hello.i -o hello.s  # 生成汇编代码

(3)生成目标文件(.o 文件)

gcc -c hello.s -o hello.o  # 生成二进制目标文件

(4)链接为可执行文件

gcc hello.o -o hello       # 链接目标文件

3. 多文件编译

(1)直接编译多个文件

gcc main.c utils.c -o program  # 编译并链接多个源文件

(2)先生成目标文件再链接

gcc -c main.c -o main.o        # 编译 main.c

gcc -c utils.c -o utils.o     # 编译 utils.c

gcc main.o utils.o -o program # 链接所有目标文件

4. 常用编译选项

选项

作用

-Wall

启用所有警告(推荐始终使用)

-Werror

将警告视为错误

-O0/-O1/-O2/-O3

优化级别(-O2 为常用平衡选项)

-g

添加调试信息(用于 GDB)

-I<dir>

指定头文件搜索路径(如 -I./include

-L<dir>

指定库文件搜索路径(如 -L./lib

-l<name>

链接动态库(如 -lm 链接数学库)

-static

强制静态链接

-D<macro>

定义宏(如 -DDEBUG

-std=c11

指定 C 标准(如 c99/c11,C++ 用 -std=c++17

详细解释如下:

(1)基础编译选项

选项

作用

gcc source.c

-o output

编译 source.c 并生成可执行文件 output

(默认生成 a.out

-E

仅执行预处理,不编译和连接

输出到屏幕(可结合 -o 保存为 .i文件)

-S

仅编译,不组装和连接,生成汇编代码(.s 文件)

-c

只编译和组装,不链接,

生成 .o 目标文件(用于分步编译)

-v

显示详细的编译过程(调试时有用)

-o

将输出放到 <文件>中

(2)警告控制选项

选项

作用

-Wall

启用所有常见警告(推荐始终使用

-Wextra

启用额外警告(比 -Wall 更严格)

-Werror

将警告视为错误(强制解决所有警告)

-Wno-unused

忽略特定警告(如 -Wno-unused-variable

(3)优化选项

选项

作用

-O0

禁用优化(默认,适合调试)

-O1

基础优化(平衡速度和大小)

-O2

推荐优化级别(提高性能,不影响可调试性)

-O3

激进优化(可能增加代码体积)

-Os

优化代码大小(嵌入式系统常用)

-flto

链接时优化(跨文件优化,需在编译和链接时都启用)

(4)调试选项

选项

作用

-g

生成调试信息(用于 GDB)

-ggdb

生成更详细的 GDB 调试信息

-g3

包含宏定义等额外调试信息

-fno-omit-frame-pointer

保留栈帧指针(方便调试)

(5)头文件与库路径

选项

作用

-I<dir>

添加头文件搜索路径(如 -I./include

-L<dir>

添加库文件搜索路径(如 -L./lib

-l<name>

链接动态库(如 -lm 链接数学库,-lpthread 链接线程库)

-static

强制静态链接(所有库静态编译进可执行文件)

-shared

生成动态库(.so.dll

-fPIC

生成位置无关代码(编译动态库时必需)

(6)语言标准控制

选项

作用

-std=c11

指定 C 标准(如 c99/c11/c17

-std=c++17

指定 C++ 标准(如 c++14/c++17/c++20

-ansi

严格遵循 ANSI C 标准(相当于 -std=c89

(7)其他实用选项

选项

作用

-D<macro>

定义宏(如 -DDEBUG 等价于代码中 #define DEBU

-U<macro>

取消宏定义

-M / -MM

生成依赖关系(用于 Makefile,-MM 忽略系统头文件)

-pthread

启用 POSIX 线程支持(比 -lpthread 更规范)

-fno-stack-protector

禁用栈保护(安全研究时可能用到)

5. 静态库与动态库

(1)静态库(.a

# 生成目标文件
gcc -c lib.c -o lib.o

# 打包为静态库
ar rcs libfoo.a lib.o

# 使用静态库
gcc main.c -L. -lfoo -o main

(2)动态库(.so

# 生成动态库(-fPIC 生成位置无关代码)
gcc -shared -fPIC lib.c -o libfoo.so

# 使用动态库(需设置 LD_LIBRARY_PATH)
gcc main.c -L. -lfoo -o main
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

6. 调试与优化

(1)使用 GDB 调试

gcc -g program.c -o program  # 编译时添加调试信息

gdb ./program                # 启动 GDB

(2)优化代码

gcc -O2 program.c -o program  # 启用 O2 优化

7. 高级用法

(1)交叉编译

# 示例:编译 ARM 架构程序
arm-linux-gnueabi-gcc program.c -o program_arm

(2)生成依赖文件(Makefile 辅助)

gcc -MM main.c  # 输出 main.o 的依赖关系

8. 完整示例

(1)编译多文件项目

gcc -Wall -O2 -I./include main.c src/utils.c -L./lib -lfoo -o program

(2)带调试信息的静态链接

gcc -g -static main.c -o program_debug

9. 常见问题

(1)undefined reference to 错误

  • 原因:缺少库或未链接目标文件。
  • 解决:检查 -l-L 参数是否正确。

(2)header not found 错误

  • 解决:使用 -I 指定头文件路径。

(3)兼容性问题

  • 指定标准:-std=c11-std=gnu11(C),-std=c++17(C++)。

总结

  • 基础流程gcc source.c -o output
  • 多文件:先编译 .o,再链接。
  • 库管理:静态库用 ar,动态库用 -shared -fPIC
  • 调试-g + GDB,优化用 -O2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值