Linux 系统编程之二编译工具使用
大纲
GCC 使用
GCC 编译器简介
GCC(GNU Compiler Collection)编译器是 GNU 开源组织发布的 UNIX/Linux 下功能强大、性能优越的编译器,支持跨平台交叉编译,它还可以将 C、C++ 等多种语言编写的源程序编译、链接成可执行文件。而 GDB 是 GNU 推出的功能强大的程序调试器,可以说 GCC 与 GDB 是在 Linux 环境下进行 C/C++ 程序开发不可缺的工具。GCC 可以编译如 C、C++、Object-C、Java、Fortran、Pascal、Modula-3 和 Ada 等多种编程语言,而且 GCC 又是一个多平台编译器,能够在当前 CPU 平台上为多种不同体系架构的硬件平台开发软件,因此尤其适合在嵌入式软件领域的开发和编译。在使用 GCC 编译程序时,编译过程可以被细分为四个阶段:预处理、编译、汇编、链接。
GCC 使用语法介绍
- 语法:gcc [options] [filenames]
参数 | 作用 | 编译示例 | 示例说明 |
---|---|---|---|
-o | 指定输出可执行程序的名称,默认文件名为”a.out” | gcc hello.c -o hello | 编译单个源文件 hello.c,指定输出可执行程序的名称为 hello,支持同时编译多个源文件 |
-E | 仅作预处理,不进行编译、汇编和链接 | gcc -E hello.c -o hello.i | 仅预处理源文件,指定生成中间文件 *.i ,此阶段主要处理源文件中的 #ifdef、#include、#define 等预处理命令 |
-S | 只编译到汇编语言,不进行汇编和链接,生成汇编代码 | gcc -S hello.c -o hello.s | 仅编译到汇编语言,指定生成汇编源文件 *.s |
-c | 只编译、汇编到目标代码,不进行链接,生成目标文件(机器语言) | gcc -c hello.s -o hello.o | 根据汇编源文件 *.s ,指定生成目标文件 *.o ,最后根据生成的目标文件,可执行 gcc hello.o -o hello 命令生成可执行程序 |
-l | 指定程序链接哪个静态库或者动态库 | ||
-m | 表示是数学库,也就是使用 math.h 头文件 | gcc hello.c -o hello -lm | 编译单个源文件 hello.c,指定输出可执行程序名称为 hello,并指定程序链接到数学库 |
-I dir | 在头文件的搜索路径列表中添加 dir 目录 | ||
-L dir | 在库文件的搜索路径列表中添加 dir 目录 | ||
-O、-O2、-O3 | 将优化状态打开,该选项不能与”-g” 选项联合使用 | ||
-g | 在生成的可执行程序中包含标准调试信息 | ||
-Wall | 在发生警告时取消编译操作,即将警告看作是错误 | ||
-pedantic | 严格要求代码符合 ANSI/ISO C 标准,若不符合则给出编译警告信息 | ||
-w | 禁止输出所有警告 | ||
-v | 打印编译器内部编译各过程的命令行信息和编译器的版本号 |
GCC 编译单个源文件
假设有 hello.c
单个源文件,编译命令如下:
gcc hello.c -o hello
GCC 编译多个源文件
假设有 hello.h
、hello.c
、main.c
三个源文件,两种编译的方式如下:
- 一次性编译:
gcc hello.c main.c –o hello
- 多次独立编译(建议加上
-Wall
参数):gcc -Wall -c main.c -o main.o
gcc -Wall -c hello.c -o hello.o
gcc -Wall main.o hello.o -o hello
GCC 编译生成可执行文件
编译流程
编译命令
步骤 | 命令 |
---|---|
1. 预处理 | gcc -E hello.c -o hello.i |
2. 编译到汇编代码 | gcc -S hello.i -o hello.s |
3. 汇编到目标代码(机器语言) | gcc -c hello.s -o hello.o |
4. 链接,生成可执行文件 | gcc hello.o -o hello |
以上四个步骤,可以合成一个步骤,直接编译链接成可执行的目标文件 | gcc hello.c -o hello |
G++ 使用
G++ 使用语法介绍
- 语法:g++ [options] [filenames]
不同构建系统的区别
目前主流的 C/C++ 构建系统有:Make、CMake、Xmake、Automake、Autoconf、Meson。