一、什么是GNU编译器?
GNU编译器(GNU Compiler Collection,简称GCC),是一套由自由软件基金会所发展的编程器。GCC支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada、以及其它一些语言。它是Linux系统和很多类Unix的标准编译器。
在GCC中,每种语言分别有单独的解释器。举例而言,编译C语言时会触发cc1、as、ld,并以一个可执行二进制文件结束。GCC目的是为了能够支持多种源代码语言并支持多种目标架构
二、GCC的编译选项
使用GCC编译时,可以指定一些选项来控制编译的过程。以下是一些常用选项:
1. 编译选项
(1)-c:只编译,不连接。
(2)-E:只运行C预处理器,不编译。
(3)-S:只编译,生成汇编代码。
2. 优化选项
(1)-O:指定最优化级别。
(2)-Os:最小化代码大小。
(3)-Og:仅在调试时开启优化。
3. 链接选项
(1)-l<库名称>:链接库。
(2)-L<库目录>:指定库目录。
(3)-no-pie: 为了旧版本ELF格式的二进制兼容而加入,它取消了PIE特性,禁止生成位置独立的可执行文件。
三、GCC用法举例
下面是一个简单的C++程序:
#include using namespace std;int main() {cout << "Hello, world!" << endl;return 0; }
我们可以使用以下的命令来编译:
g++ -o helloworld helloworld.cpp
这里,g++ 是 GCC 对 C++ 的编译器,-o 选项指定输出的二进制文件名称为 helloworld,然后我们指定编译的文件为 helloworld.cpp。
通过以下命令可以查看GCC的版本:
gcc -v
如果发现版本较旧,可以选择进行升级。
which gcc 可以查看路径
只要是 GCC 支持编译的程序代码,都可以使用 gcc 命令完成编译。可以这样理解,gcc 是 GCC 编译器的通用编译指令,因为根据程序文件的后缀名,gcc 指令可以自行判断出当前程序所用编程语言的类别,比如:
- xxx.c:默认以编译 C 语言程序的方式编译此文件;
- xxx.cpp:默认以编译 C++ 程序的方式编译此文件。
- xxx.m:默认以编译 Objective-C 程序的方式编译此文件;
- xxx.go:默认以编译 Go 语言程序的方式编译此文件;
当然,gcc 指令也为用户提供了“手动指定代表编译方式”的接口,即使用 -x 选项。例如,gcc -xc xxx 表示以编译 C 语言代码的方式编译 xxx 文件;而 gcc -xc++ xxx 则表示以编译 C++ 代码的方式编译 xxx 文件。
但如果使用 g++ 指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++ 代码的方式编译该文件。也就是说,对于 .c 文件来说,gcc 指令以 C 语言代码对待,而 g++ 指令会以 C++ 代码对待。但对于 .cpp 文件来说,gcc 和 g++ 都会以 C++ 代码的方式编译。