Skip to content

GCC开发指南

1. GCC简介

GCC全称为GNU Compiler Collection,即GNU编译器套件。是GNU项目开发的编译器软件,最初支持C/C++,后拓展支持ObjectC、Go、Fortran等多种语言,发展为一个编译器套件,现在主要由FSF支持维护。

1.1 本系统上的GCC选型及维护政策

本系统上的GCC版本为12.x,在GCC上游社区的12版本完整维护周期内,本系统将会及时跟进小版本的更新,直至GCC12.x的最后一个版本后,本系统仍旧为GCC12的bugfix进行后续维护,直至本系统的当前版本不再维护。

1.2 本系统上的GCC组件

组件 X86_64 Aarch64 Loongarch64 Riscv64 SW_64 说明
gcc 支持 支持 暂无 暂无 暂无 GCC的C编译器
gcc-c++ 支持 支持 暂无 暂无 暂无 GCC的C++编译器,有些发行版称为g++
gccgo 支持 支持 暂无 暂无 暂无 GCC的Golang编译器
gfortran 支持 支持 暂无 暂无 暂无 GCC的Fortran编译器
gnat 支持 支持 暂无 暂无 暂无 GCC的Ada编译器
gcc-objc 支持 支持 暂无 暂无 暂无 GCC的ObjectC编译器
gcc-obgc++ 支持 支持 暂无 暂无 暂无 GCC的ObjectC++编译器
gcc-gdc 支持 支持 暂无 暂无 暂无 GCC的D语言编译器
gcc-gm2 不支持 不支持 不支持 不支持 不支持 GCC的M2语言编译器,GCC13新增,本系统不支持

1.3 安装

# gcc
dnf install gcc
# gcc-c++
dnf install gcc-c++
# gccgo
dnf install gccgo
# gfortran
dnf install gfortran
# libtsan
dnf install libtsan
# 使用tsan进行开发
dnf install libtsan-devel
# 其他组件请参看1.2,按照组件名进行安装
# 请注意,libgomp不提供devel包

2. GCC使用介绍

2.1 GCC的使用流程简介 - 以C语言为例

以一个名为helloworld.c的C程序源码文件为例:

#include <stdio.h>
int main() {
    printf("hello,world!\n");
    return 0;
}
从安装到执行该源码的流程如下:
# 安装C编译器
dnf install gcc
# 编译为二进制
gcc -o helloworld helloworld.c
# 执行
./helloworld

2.2 GCC执行程序的更多功能介绍

编译器对源码处理过程可以分为预处理(也称预编译,Preprocessing)、编译 (Compilation)、汇编 (Assembly)和链接(Linking)四个过程。下面我们来尝试使用gcc进行分步骤处理。

以一个名为hellooc.cpp的文件为例,

#include <iostream>
using namespace std;

char* hellooc(char* oc) {
    cout << "hello, " << oc << "!" << endl;
    return oc;
}

需要安装相对应的GCC编译器开发环境

#安装GCC C++编译器和C++开发库、运行时
dnf install gcc-c++ libstdc++-devel

2.2.1 预处理

首先进行预处理:

g++ -E -o hellooc.i hellooc.cpp
# 结果过长,本文档不做结果展示,请自行执行查看
less hellooc.i

2.2.2 编译

然后执行编译(狭义的编译),结果为汇编代码:

g++ -S -o hellooc.s -fPIC hellooc.i
# 结果过长,本文档不做结果展示,请自行执行查看
less hellooc.s

2.2.3 汇编编译

继续执行汇编编译,结果为未链接的目标文件:

g++ -c -o hellooc.o hellooc.s

2.2.4 链接

最后执行链接,结果为链接库:

# 动态链接
g++ -o hellooc.so -shared -lstdc++ hellooc.o

# 静态链接
ar rcs hellooc.a hellooc.o
结果如下:
hellooc.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=92a45a52fc17fa866d765841e159d57271e767b1, not stripped

hellooc.a: current ar archive

3. 更多参考资料

本文档仅用于开发者了解本系统上的GCC组件支持情况、安装方式和简单的使用示例,更多GCC和开发资料,请查看GCC官方文档和第三方资料。

GCC 12.x 官方文档: https://gcc.gnu.org/gcc-12/

GCC 中文文档: https://runebook.dev/zh/docs/gcc/-index-