GNU
GNU 编译器集合(GNU Compiler Collection,简称 GCC)是一个由自由软件基金会(Free Software Foundation,简称 FSF)开发的编译器系统,它是 GNU 项目的一部分。GCC 支持多种编程语言,并且是许多开源项目和操作系统中的标准编译工具。
支持的语言
- C:ISO C 标准和 GNU C 扩展。
- C++:ISO C++ 标准和 GNU C++ 扩展。
- Objective-C:支持 Objective-C 语言和 GNU Objective-C 运行时。
- Fortran:支持多种 Fortran 标准。
- Java:GCC 曾包含对 Java 的支持,但自 GCC 5 版本起已不再包含。
- Ada:通过 GNU Ada 编译器(GNAT)提供支持。
- 其他语言:GCC 还支持一些较少使用的编程语言,如 Go、D、等。
主要组件
- 前端:解析源代码并生成中间表示(Intermediate Representation,IR)。
- 中间端:优化中间表示。
- 后端:将优化后的中间表示转换为目标机器的汇编代码。
- 汇编器:将汇编代码转换为机器代码。
- 链接器:将多个目标文件和库链接成最终的可执行文件。
特点
- 跨平台:GCC 可以在多种操作系统和硬件架构上编译源代码,生成适用于不同平台的可执行文件。
- 优化:提供多种优化选项,帮助开发者生成高效的代码。
- 调试支持:生成调试信息,与 GDB(GNU Debugger)等调试工具兼容。
- 标准遵循:遵循各种编程语言的国际标准,确保代码的可移植性和兼容性。
- 扩展性:GCC 的设计允许添加对新语言和新特性的支持。
使用场景
- 操作系统开发:许多操作系统,包括 Linux,使用 GCC 进行系统和应用程序的开发。
- 嵌入式系统:GCC 提供了对多种嵌入式处理器的支持,广泛用于嵌入式开发。
- 学术研究:GCC 的灵活性和可扩展性使其成为学术研究中常用的编译器。
- 工业应用:许多商业软件也使用 GCC 进行编译,因为它是免费且功能强大的工具。
发展历史
- GCC 最初由 Richard Stallman 在 1987 年开始开发。
- 随着时间的推移,GCC 不断扩展,支持更多的编程语言和平台。
- GCC 是 GNU 项目中最重要的组成部分之一,也是自由软件运动的象征。
GCC 不断更新和改进,以适应不断变化的编程语言标准和硬件技术。它在软件开发领域中扮演着不可或缺的角色。
g++与gcc
g++ 和 gcc 都是 GNU 编译器集合(GNU Compiler Collection,简称 GCC)的一部分,它们用于编译不同的编程语言源代码。GCC 是一个开源项目,支持多种编程语言,包括但不限于 C、C++、Objective-C、Fortran、Java 和 Ada。
g++ 是 GNU 编译器集合中的 C++ 编译器,而 gcc 是 GNU 编译器集合中的 C 编译器。它们都是 GNU 编译器集合(GNU Compiler Collection)的一部分,通常用于编译 C 和 C++ 程序。
- gcc(GNU C Compiler)
- 用途:用于编译 C 语言源代码。
- 特点:
- 支持 ISO C 标准和 GNU C 扩展。
- 提供了多种编译选项来优化代码和生成调试信息。
- 可以生成可执行文件或编译成汇编代码。
- g++(GNU C++ Compiler)
- 用途:用于编译 C++ 语言源代码。
- 特点:
- 支持 ISO C++ 标准和 GNU C++ 扩展。
- 除了 C++ 特有的特性外,也支持 C 语言的特性。
- 支持模板、异常处理、运行时类型识别等 C++ 特性。
- 可以与 g++ 一起使用 C++ 标准库,例如 STL(Standard Template Library)。
编译过程
编译过程通常包括以下几个步骤:
- 预处理:处理源代码中的宏定义、条件编译指令等。
- 编译:将预处理后的代码转换成汇编代码。
- 汇编:将汇编代码转换成机器代码。
- 链接:将多个目标文件和库文件链接成一个可执行文件。
编译选项示例
- -o < filename > :指定输出的可执行文件名。
- -g:生成调试信息,方便使用调试器。
- -Wall:打开所有警告信息,帮助开发者发现潜在问题。
- -O2:优化代码,提高程序运行效率,但可能增加编译时间。
- -std=c++11:指定使用 C++11 标准进行编译。
注意事项
- g++ 可以编译 C 语言代码,但通常使用 gcc 来编译 C 语言源代码,以避免混淆。
- 某些情况下,g++ 可能默认使用较新的 C++ 标准,而 gcc 可能默认使用较新的 C 标准。
- 编译器的版本和选项可能会影响编译结果和性能。
g++ 编译可执行程序过程
- c++程序:
main.cpp
#include <iostream>
using namespace std;int add (int a, int b)
{return a+b;
}int main()
{int x = 30;int y = 100;int ret = add(x, y);cout << "sum: " << ret << endl;return 0;
}
- 终端输入编译 g++编译命令:
g++ -o add main.cpp
- 运行生成的可执行程序:
./add
- 查看结果:
sum: 130
- 编译选项:
-Wall
:打开几乎所有的警告信息。
--std=c++14
:指定使用C++14标准(你可以根据自己的需求选择其他标准,如c++11、c++17等)。-O2
:优化编译,提高程序运行效率。
- g++优化编译命令:
g++ -Wall -std=c++14 -O2 -o add main.cpp
- 可以看到程序运行更快了。
g++ 编译动态库并链接到可执行程序过程
- c++ 程序:
add.cpp
、add.hpp
、main.cpp
add.hpp
int add(int a, int b);
add.cpp
#include "add.hpp"int add(int a, int b)
{return a+b;
}
main.cpp
#include <iostream>
#include "add.hpp"using namespace std;int main()
{int x = 30;int y = 100;int ret = add(x, y);cout << "sum: " << ret << endl;return 0;
}
- 编译动态库的目标文件 add.o:
g++ -c -fPIC -Wall -std=c++14 -O2 -o add.o add.cpp
- 编译动态库 add.a:
g++ -shared -o add.a add.o
- 编译可执行程序目标文件 main.o:
g++ -c -Wall -std=c++14 -O2 -o main.o main.cpp
- 链接动态库编译成可执行程序:
g++ -o main main.o -L. add.a
- 运行生成的可执行程序:
./main
- 查看结果:
sum: 130