活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

Rocky Linux系统下从零开始编译源代码的完整指南与常见问题解决方法助你轻松掌握Linux编译技能

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-17 14:10:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在Linux世界中,从源代码编译软件是一项基本且重要的技能。Rocky Linux作为CentOS的替代品,是一个稳定、可靠的企业级操作系统,广泛应用于服务器环境。虽然通过包管理器(如dnf或yum)安装软件是最简单的方式,但有时我们需要从源代码编译软件,原因可能包括:

• 需要特定版本的软件,而仓库中未提供
• 需要自定义功能或优化选项
• 软件尚未打包到Rocky Linux的仓库中
• 学习和了解软件内部工作原理

本文将详细介绍在Rocky Linux系统下从零开始编译源代码的完整过程,包括准备工作、编译步骤、常见问题解决方法,帮助读者掌握Linux编译技能。

准备工作

系统要求

在开始编译源代码之前,确保你的Rocky Linux系统满足以下基本要求:

• 至少20GB的可用磁盘空间(大型软件可能需要更多空间)
• 足够的RAM(建议至少4GB,大型软件编译需要更多)
• 稳定的网络连接(用于下载源代码和依赖项)
• 具有sudo权限的用户账户

更新系统

首先,确保你的Rocky Linux系统是最新的:
  1. sudo dnf update -y
  2. sudo dnf upgrade -y
复制代码

安装必要的开发工具

Rocky Linux提供了一个”Development Tools”软件包组,包含了编译软件所需的基本工具:
  1. sudo dnf groupinstall "Development Tools" -y
复制代码

这将安装GCC、GNU Make、binutils、autoconf、automake等基本编译工具。

安装其他常用开发库和工具

根据你要编译的软件类型,可能需要安装额外的开发库和工具:
  1. sudo dnf install -y \
  2.     git \
  3.     wget \
  4.     curl \
  5.     openssl-devel \
  6.     zlib-devel \
  7.     readline-devel \
  8.     sqlite-devel \
  9.     bzip2-devel \
  10.     libffi-devel \
  11.     ncurses-devel \
  12.     gdbm-devel \
  13.     xz-devel \
  14.     tk-devel
复制代码

这些是常见的开发库,具体需要哪些取决于你要编译的软件。

配置环境变量

为了方便使用,可以设置一些环境变量。编辑~/.bashrc或~/.bash_profile文件:
  1. nano ~/.bashrc
复制代码

添加以下内容:
  1. # 设置编译器优化标志
  2. export CFLAGS="-O2 -march=native"
  3. export CXXFLAGS="$CFLAGS"
  4. # 添加本地安装路径到PATH
  5. export PATH="$HOME/.local/bin:$PATH"
  6. # 设置库文件路径
  7. export LD_LIBRARY_PATH="$HOME/.local/lib:$LD_LIBRARY_PATH"
复制代码

保存文件后,执行以下命令使更改生效:
  1. source ~/.bashrc
复制代码

编译基础

理解编译过程

编译是将人类可读的源代码转换为计算机可执行的机器代码的过程。在Linux中,典型的编译过程包括以下步骤:

1. 配置:运行配置脚本(通常是./configure),检查系统环境并生成Makefile
2. 编译:使用make工具根据Makefile编译源代码
3. 安装:将编译好的文件复制到系统目录中

常用编译工具介绍

GCC是一套编程语言编译器,支持C、C++、Objective-C、Fortran、Ada、Go和D等语言。在Rocky Linux中,可以通过以下命令安装GCC:
  1. sudo dnf install gcc gcc-c++ -y
复制代码

Make是一个构建自动化工具,通过读取Makefile中的指令来编译和链接程序。Makefile定义了文件之间的依赖关系和生成这些文件的命令。

Autoconf是一个用于生成shell脚本的工具,这些脚本可以自动配置软件源代码包以适应多种Unix类系统。Automake则是一个用于自动生成Makefile.in文件的工具,这些文件可以被Autoconf生成的配置脚本使用。

CMake是一个跨平台的构建系统生成器,它使用名为CMakeLists.txt的配置文件来生成标准的构建文件(如Unix下的Makefile或Windows下的Visual Studio项目)。

详细编译步骤

1. 获取源代码

获取源代码的常见方式包括:

许多软件项目在其官方网站提供源代码压缩包:
  1. wget https://example.com/software-x.y.z.tar.gz
复制代码

对于使用Git进行版本控制的项目:
  1. git clone https://github.com/username/project.git
  2. cd project
复制代码

Rocky Linux允许通过dnf获取软件包的源代码:
  1. sudo dnf install -y dnf-plugins-core
  2. sudo dnf download --source package_name
复制代码

2. 解压源代码(如果需要)

如果下载的是压缩包,需要先解压:
  1. tar -xzf software-x.y.z.tar.gz
  2. cd software-x.y.z
复制代码

3. 查看文档

在编译之前,务必阅读源代码中的文档,如README、INSTALL等文件,这些文件通常包含编译和安装的特定说明:
  1. ls
  2. cat README
  3. cat INSTALL
复制代码

4. 配置编译环境

大多数使用Autoconf的项目使用以下命令进行配置:
  1. ./configure
复制代码

可以添加各种选项来自定义安装:
  1. ./configure --prefix=/usr/local \
  2.             --sysconfdir=/etc \
  3.             --localstatedir=/var \
  4.             --enable-feature \
  5.             --disable-other-feature
复制代码

常用选项包括:

• --prefix:指定安装目录前缀(默认为/usr/local)
• --sysconfdir:指定配置文件目录
• --localstatedir:指定可变数据目录
• --enable-feature:启用特定功能
• --disable-feature:禁用特定功能
• --with-package:使用特定的外部包
• --without-package:不使用特定的外部包

对于使用CMake的项目:
  1. mkdir build
  2. cd build
  3. cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local \
  4.          -DENABLE_FEATURE=ON \
  5.          -DDISABLE_FEATURE=OFF
复制代码

5. 编译源代码

配置完成后,使用make工具编译源代码:
  1. make
复制代码

为了加快编译速度,可以使用-j选项指定并行编译任务数,通常设置为CPU核心数加1:
  1. make -j$(nproc+1)
复制代码

6. 测试编译结果(可选)

许多项目提供了测试套件,可以验证编译是否成功:
  1. make check
  2. # 或
  3. make test
复制代码

7. 安装软件

编译成功后,使用以下命令安装软件:
  1. sudo make install
复制代码

如果不想安装到系统目录,可以使用DESTDIR变量指定临时安装目录:
  1. make install DESTDIR=/tmp/install
复制代码

8. 清理(可选)

编译完成后,可以清理临时文件:
  1. make clean
复制代码

如果要完全恢复到原始状态(包括配置文件):
  1. make distclean
复制代码

常见问题及解决方案

1. 缺少依赖项

问题:配置或编译过程中出现”error: No such file or directory”或类似错误,提示缺少某些头文件或库。

解决方案:安装缺少的开发包。例如,如果缺少OpenSSL开发文件:
  1. sudo dnf install openssl-devel -y
复制代码

对于其他缺少的依赖,可以使用dnf搜索:
  1. dnf search keyword
复制代码

2. 编译器版本不兼容

问题:软件需要特定版本的GCC或其他编译器,但系统中的版本不符合要求。

解决方案:安装所需版本的编译器。Rocky Linux允许安装多个版本的GCC:
  1. sudo dnf install gcc-toolset-11-gcc gcc-toolset-11-gcc-c++ -y
  2. scl enable gcc-toolset-11 bash
复制代码

3. 配置脚本找不到库或程序

问题:运行./configure时,提示找不到某些库或程序,即使它们已经安装。

解决方案:指定库或程序的路径:
  1. export LDFLAGS="-L/path/to/library"
  2. export CPPFLAGS="-I/path/to/headers"
  3. ./configure
复制代码

或者使用--with选项:
  1. ./configure --with-ssl=/usr/local/ssl
复制代码

4. Makefile错误

问题:运行make时出现Makefile相关错误。

解决方案:

• 确保使用的是GNU Make:make --version
• 如果Makefile是自动生成的,尝试重新生成:autoreconf -fiv
./configure
make

确保使用的是GNU Make:
  1. make --version
复制代码

如果Makefile是自动生成的,尝试重新生成:
  1. autoreconf -fiv
  2. ./configure
  3. make
复制代码

5. 内存不足

问题:编译大型软件时出现内存不足错误。

解决方案:

• 增加交换空间:sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
• 减少并行编译任务数:make -j1

增加交换空间:
  1. sudo fallocate -l 4G /swapfile
  2. sudo chmod 600 /swapfile
  3. sudo mkswap /swapfile
  4. sudo swapon /swapfile
复制代码

减少并行编译任务数:
  1. make -j1
复制代码

6. 权限问题

问题:安装时出现权限错误。

解决方案:使用sudo或确保对目标目录有写权限:
  1. sudo make install
复制代码

或者安装到用户目录:
  1. ./configure --prefix=$HOME/.local
  2. make
  3. make install
复制代码

7. 链接错误

问题:编译过程中出现未定义引用或链接错误。

解决方案:

• 确保所有必要的库都已安装
• 检查库路径是否正确:export LD_LIBRARY_PATH="/path/to/libs:$LD_LIBRARY_PATH"
• 在Makefile中添加必要的链接选项
  1. export LD_LIBRARY_PATH="/path/to/libs:$LD_LIBRARY_PATH"
复制代码

8. 运行时库找不到

问题:编译安装成功,但运行程序时提示找不到共享库。

解决方案:

• 将库路径添加到/etc/ld.so.conf.d/:echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/custom.conf
sudo ldconfig
• 或者设置LD_LIBRARY_PATH环境变量:export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"

将库路径添加到/etc/ld.so.conf.d/:
  1. echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/custom.conf
  2. sudo ldconfig
复制代码

或者设置LD_LIBRARY_PATH环境变量:
  1. export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
复制代码

高级技巧

优化编译

通过设置编译器标志可以优化生成的二进制文件:
  1. export CFLAGS="-O3 -march=native -pipe"
  2. export CXXFLAGS="$CFLAGS"
  3. ./configure
  4. make
复制代码

常用优化选项:

• -O0:无优化(默认)
• -O1:基本优化
• -O2:推荐优化级别
• -O3:最高优化级别
• -march=native:针对当前CPU架构优化
• -pipe:使用管道而不是临时文件进行编译

并行编译

使用make -j选项可以显著加快编译速度:
  1. make -j$(nproc)
复制代码

交叉编译

交叉编译是在一个平台上为另一个平台编译代码。例如,在x86_64系统上为ARM架构编译:
  1. export CROSS_COMPILE=arm-linux-gnueabihf-
  2. export CC=${CROSS_COMPILE}gcc
  3. export AR=${CROSS_COMPILE}ar
  4. ./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
  5. make
复制代码

使用ccache加速编译

ccache是一个编译器缓存,可以加速重复编译:
  1. sudo dnf install ccache -y
  2. export CC="ccache gcc"
  3. export CXX="ccache g++"
  4. ./configure
  5. make
复制代码

创建RPM包

如果你想在Rocky Linux上分发编译的软件,可以创建RPM包:
  1. sudo dnf install rpm-build -y
  2. mkdir -p ~/rpmbuild/{SOURCES,SPECS,BUILD,RPMS,SRPMS}
  3. # 将源代码放入SOURCES目录
  4. # 创建.spec文件
  5. rpmbuild -ba your_package.spec
复制代码

实例演示:编译安装Nginx

让我们通过一个具体的例子来演示整个编译过程。我们将从源代码编译安装Nginx Web服务器。

1. 安装依赖
  1. sudo dnf install -y \
  2.     gcc \
  3.     gcc-c++ \
  4.     make \
  5.     pcre-devel \
  6.     zlib-devel \
  7.     openssl-devel \
  8.     gd-devel \
  9.     perl-ExtUtils-Embed
复制代码

2. 下载源代码
  1. cd /tmp
  2. wget https://nginx.org/download/nginx-1.21.6.tar.gz
  3. tar -xzf nginx-1.21.6.tar.gz
  4. cd nginx-1.21.6
复制代码

3. 配置编译选项
  1. ./configure \
  2.     --prefix=/usr/local/nginx \
  3.     --sbin-path=/usr/local/nginx/sbin/nginx \
  4.     --conf-path=/etc/nginx/nginx.conf \
  5.     --error-log-path=/var/log/nginx/error.log \
  6.     --http-log-path=/var/log/nginx/access.log \
  7.     --pid-path=/var/run/nginx.pid \
  8.     --lock-path=/var/run/nginx.lock \
  9.     --http-client-body-temp-path=/var/cache/nginx/client_temp \
  10.     --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
  11.     --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
  12.     --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
  13.     --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
  14.     --user=nginx \
  15.     --group=nginx \
  16.     --with-compat \
  17.     --with-file-aio \
  18.     --with-threads \
  19.     --with-http_addition_module \
  20.     --with-http_auth_request_module \
  21.     --with-http_dav_module \
  22.     --with-http_flv_module \
  23.     --with-http_gunzip_module \
  24.     --with-http_gzip_static_module \
  25.     --with-http_mp4_module \
  26.     --with-http_random_index_module \
  27.     --with-http_realip_module \
  28.     --with-http_secure_link_module \
  29.     --with-http_slice_module \
  30.     --with-http_ssl_module \
  31.     --with-http_stub_status_module \
  32.     --with-http_sub_module \
  33.     --with-http_v2_module \
  34.     --with-mail \
  35.     --with-mail_ssl_module \
  36.     --with-stream \
  37.     --with-stream_realip_module \
  38.     --with-stream_ssl_module \
  39.     --with-stream_ssl_preread_module \
  40.     --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'
复制代码

4. 编译
  1. make -j$(nproc)
复制代码

5. 创建nginx用户和目录
  1. sudo useradd -r -d /var/cache/nginx -s /sbin/nologin nginx
  2. sudo mkdir -p /var/cache/nginx
复制代码

6. 安装
  1. sudo make install
复制代码

7. 创建systemd服务文件
  1. sudo tee /etc/systemd/system/nginx.service > /dev/null <<EOF
  2. [Unit]
  3. Description=nginx - high performance web server
  4. Documentation=https://nginx.org/en/docs/
  5. After=network-online.target remote-fs.target nss-lookup.target
  6. Wants=network-online.target
  7. [Service]
  8. Type=forking
  9. PIDFile=/var/run/nginx.pid
  10. ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf
  11. ExecStart=/usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
  12. ExecReload=/bin/kill -s HUP \$MAINPID
  13. ExecStop=/bin/kill -s TERM \$MAINPID
  14. [Install]
  15. WantedBy=multi-user.target
  16. EOF
复制代码

8. 启动Nginx
  1. sudo systemctl daemon-reload
  2. sudo systemctl enable nginx
  3. sudo systemctl start nginx
复制代码

9. 验证安装
  1. curl -I http://localhost
复制代码

如果看到类似”HTTP/1.1 200 OK”的响应,说明Nginx已成功安装并运行。

总结与最佳实践

在Rocky Linux系统下从源代码编译软件是一项重要的技能,通过本文的介绍,你应该已经掌握了从准备工作到最终安装的完整流程。以下是一些最佳实践,帮助你更高效地进行源代码编译:

最佳实践

1. 阅读文档:始终先阅读软件的README、INSTALL等文档,了解特定的编译要求和选项。
2. 使用包管理器:尽可能使用dnf安装依赖项,而不是手动下载和安装。
3. 保持环境整洁:使用make DESTDIR或--prefix选项将软件安装到指定目录,避免污染系统目录。
4. 记录编译选项:记录你使用的配置选项,以便将来重新编译或升级软件。
5. 使用版本控制:如果对软件进行了修改,使用Git等版本控制系统跟踪更改。
6. 创建备份:在编译和安装重要软件之前,备份系统和数据。
7. 测试:在部署到生产环境之前,在测试环境中验证编译的软件。
8. 保持系统更新:定期更新系统和开发工具,以获得最新的功能和安全修复。

阅读文档:始终先阅读软件的README、INSTALL等文档,了解特定的编译要求和选项。

使用包管理器:尽可能使用dnf安装依赖项,而不是手动下载和安装。

保持环境整洁:使用make DESTDIR或--prefix选项将软件安装到指定目录,避免污染系统目录。

记录编译选项:记录你使用的配置选项,以便将来重新编译或升级软件。

使用版本控制:如果对软件进行了修改,使用Git等版本控制系统跟踪更改。

创建备份:在编译和安装重要软件之前,备份系统和数据。

测试:在部署到生产环境之前,在测试环境中验证编译的软件。

保持系统更新:定期更新系统和开发工具,以获得最新的功能和安全修复。

常见编译场景

1. 开发环境:在开发环境中,你可能需要频繁编译软件。使用ccache和并行编译可以显著提高效率。
2. 生产环境:在生产环境中,稳定性比编译速度更重要。使用经过测试的编译选项,并进行充分的测试。
3. 嵌入式系统:在嵌入式系统上,通常需要交叉编译。确保正确设置交叉编译工具链和目标平台选项。
4. 高性能计算:在高性能计算环境中,优化编译选项可以显著提高软件性能。使用-O3和特定于CPU的优化选项。

开发环境:在开发环境中,你可能需要频繁编译软件。使用ccache和并行编译可以显著提高效率。

生产环境:在生产环境中,稳定性比编译速度更重要。使用经过测试的编译选项,并进行充分的测试。

嵌入式系统:在嵌入式系统上,通常需要交叉编译。确保正确设置交叉编译工具链和目标平台选项。

高性能计算:在高性能计算环境中,优化编译选项可以显著提高软件性能。使用-O3和特定于CPU的优化选项。

资源与进一步学习

• GNU Make手册:https://www.gnu.org/software/make/manual/
• GCC在线文档:https://gcc.gnu.org/onlinedocs/
• Autoconf手册:https://www.gnu.org/software/autoconf/manual/
• CMake文档:https://cmake.org/documentation/
• Rocky Linux文档:https://docs.rockylinux.org/

通过不断实践和学习,你将能够熟练掌握在Rocky Linux系统下从源代码编译软件的技能,为你的工作和学习提供更多可能性。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则