GCC编译CentOS软件包流程是怎样的
小樊
38
2025-12-17 09:28:56
在CentOS上用GCC编译打包的推荐流程
一 准备环境
- 安装基础编译工具与依赖:
- 安装开发工具组:sudo yum groupinstall “Development Tools” -y
- 安装C/C++编译器:sudo yum install -y gcc gcc-c++ make
- 其他常用依赖(按需):bison flex texinfo gmp-devel mpfr-devel libmpc-devel ncurses-devel
- 准备打包工具(推荐 RPM 打包):
- 安装 RPM 构建工具:sudo yum install -y rpm-build rpmdevtools
- 准备源码与版本控制:
- 建议将源码放入 ~/rpmbuild/SOURCES/,规范目录结构由 rpmdevtools 提供(如 rpmdev-setuptree)。
二 获取源码与准备构建目录
- 获取源码包(示例):
- 下载:wget https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz
- 解压并放入 SOURCES:tar xf hello-2.12.tar.gz && mv hello-2.12.tar.gz ~/rpmbuild/SOURCES/
- 生成打包骨架(rpmbuild 工作目录):
- 执行:rpmdev-setuptree(生成 ~/rpmbuild/{SPECS,SOURCES,BUILD,RPMS,SRPMS})
- 放置 spec 文件:
- 将自定义的 hello.spec 放入 ~/rpmbuild/SPECS/(后续说明 spec 关键字段)。
三 编写SPEC文件要点
- 关键字段与目录映射(简表):
- Name / Version / Release:软件名、版本、发布号
- Summary / License / URL:简介、许可证、主页
- Source0:指向 ~/rpmbuild/SOURCES/hello-2.12.tar.gz
- BuildRequires:构建时依赖(如 gcc, make)
- Requires:运行时依赖(按需)
- %description:描述
- %prep:解压与补丁(常用 %setup -q)
- %build:构建步骤(示例:./configure && make -j$(nproc))
- %install:安装到 %{buildroot}(示例:make install DESTDIR=%{buildroot})
- %files:列出安装到根的文件清单
- %changelog:变更记录
- 最小可用示例(仅示意,需按项目调整):
- Name: hello
- Version: 2.12
- Release: 1%{?dist}
- Summary: A minimal hello world program
- License: GPLv3+
- URL: https://www.gnu.org/software/hello/
- Source0: %{name}-%{version}.tar.gz
- BuildRequires: gcc, make
- %description
- Hello world demo packaged by GCC on CentOS.
- %prep
- %build
- ./configure --prefix=/usr
- make %{?_smp_mflags}
- %install
- make install DESTDIR=%{buildroot}
- %files
- %{_bindir}/hello
- %{_mandir}/man1/hello.1*
- %changelog
四 使用GCC构建与生成RPM包
- 构建二进制 RPM 与源码 RPM:
- 在 ~/rpmbuild/SPECS/ 目录执行:
- 构建二进制包:rpmbuild -ba hello.spec
- 仅构建源码包:rpmbuild -bs hello.spec
- 产物位置:
- 二进制 RPM:~/rpmbuild/RPMS/x86_64/hello-2.12-1.el7.x86_64.rpm(架构随系统变化)
- 源码 RPM:~/rpmbuild/SRPMS/hello-2.12-1.el7.src.rpm
- 本地安装与验证:
- 安装:sudo yum localinstall ~/rpmbuild/RPMS/x86_64/hello-*.rpm -y
- 验证:hello --version 或 rpm -qi hello、rpm -ql hello。
五 常见问题与进阶建议
- 构建依赖缺失:在 BuildRequires 中补全(如 gcc-c++, ncurses-devel, gmp-devel, mpfr-devel, libmpc-devel),再重新构建。
- 并行编译加速:在 %build 中使用 make %{?_smp_mflags} 或 -j$(nproc)(注意机器内存与核心数,避免 OOM)。
- 多版本 GCC 与兼容性:
- CentOS 7 基础源 gcc 4.8.5 较旧,若需 C++14/17/20,建议通过 devtoolset(如 devtoolset-8/9/10)按需启用高版本 GCC,避免直接替换系统编译器。
- 启用方式:scl enable devtoolset-8 bash(仅当前会话),或在脚本中 source /opt/rh/devtoolset-8/enable。
- 升级 GCC 的两种方式对比(简要):
- 源码编译安装:可控性强,可装到 /usr/local/gcc-x.y.z,但维护成本高。
- SCL devtoolset:与系统隔离、切换方便、回退简单,适合生产环境。