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.hhello.cmain.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 编译生成可执行文件的流程

编译流程图

gcc-step-view

编译详细命令

步骤命令
1. 预处理 gcc -E hello.c -o hello.i
2. 编译到汇编代码 gcc -S hello.c -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-plus-params

不同构建系统的区别

目前主流的 C/C++ 构建系统有:Make、CMake、Xmake、Automake、Autoconf、Meson。