活动公告

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

CentOS系统下源码编译软件的完整指南从环境准备到编译安装一步步教你掌握Linux下源码编译的核心技能

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

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

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

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

x
引言

在Linux系统中,软件安装通常有多种方式,包括使用包管理器(如yum、dnf、apt等)直接安装预编译的二进制包,或者从源码编译安装。源码编译安装虽然过程相对复杂,但它提供了更多的灵活性和控制权,可以自定义软件功能、优化性能,以及获取最新版本的软件。

本文将详细介绍在CentOS系统下如何从源码编译安装软件,从环境准备到最终安装完成的全过程,帮助读者掌握Linux下源码编译的核心技能。

环境准备

在开始源码编译之前,我们需要确保系统环境已经准备就绪。这包括更新系统、安装必要的开发工具和库文件。

系统更新

首先,确保你的CentOS系统是最新的,以避免因系统版本过旧导致的兼容性问题。
  1. # 对于CentOS 7及以下版本
  2. sudo yum update -y
  3. # 对于CentOS 8及以上版本
  4. sudo dnf update -y
复制代码

安装开发工具组

CentOS提供了”Development Tools”软件包组,包含了编译软件所需的基本工具,如gcc、make、automake等。
  1. # 对于CentOS 7及以下版本
  2. sudo yum groupinstall "Development Tools" -y
  3. # 对于CentOS 8及以上版本
  4. sudo dnf groupinstall "Development Tools" -y
复制代码

安装常用依赖库

许多软件在编译过程中需要依赖一些库文件,提前安装这些库可以避免编译过程中出现错误。
  1. # 安装常用的开发库
  2. sudo yum install -y gcc-c++ openssl-devel bzip2-devel libffi-devel zlib-devel readline-devel sqlite-devel gdbm-devel db4-devel libpcap-devel xz-devel
  3. # 如果是CentOS 8及以上版本
  4. sudo dnf install -y gcc-c++ openssl-devel bzip2-devel libffi-devel zlib-devel readline-devel sqlite-devel gdbm-devel db4-devel libpcap-devel xz-devel
复制代码

验证编译环境

安装完成后,我们可以验证一下必要的编译工具是否已经正确安装。
  1. # 检查gcc版本
  2. gcc --version
  3. # 检查make版本
  4. make --version
  5. # 检查autoconf版本
  6. autoconf --version
复制代码

如果以上命令都能正常显示版本信息,说明编译环境已经准备就绪。

源码获取与解压

获取源码

源码通常可以从官方网站、GitHub等代码托管平台获取。常见的方式有:

1. 使用wget或curl直接下载源码压缩包
2. 使用git克隆源码仓库
  1. # 使用wget下载(以nginx为例)
  2. wget https://nginx.org/download/nginx-1.20.2.tar.gz
  3. # 使用curl下载
  4. curl -O https://nginx.org/download/nginx-1.20.2.tar.gz
复制代码
  1. # 安装git(如果尚未安装)
  2. sudo yum install -y git
  3. # 克隆仓库(以Redis为例)
  4. git clone https://github.com/redis/redis.git
复制代码

解压源码

下载的源码通常是压缩格式的,需要解压后才能进行编译。
  1. # 解压.tar.gz文件
  2. tar -zxvf nginx-1.20.2.tar.gz
  3. # 解压.tar.bz2文件
  4. tar -jxvf package.tar.bz2
  5. # 解压.zip文件
  6. unzip package.zip
复制代码

解压后,进入源码目录:
  1. cd nginx-1.20.2
复制代码

配置编译选项

在编译之前,通常需要运行配置脚本(通常是configure脚本)来检测系统环境并生成Makefile。这个过程允许我们自定义软件的安装路径、启用或禁用特定功能等。

基本配置

大多数开源软件都遵循GNU标准的构建系统,使用configure脚本进行配置:
  1. ./configure
复制代码

常用配置选项

configure脚本通常支持多种选项,可以通过./configure --help查看所有可用选项。以下是一些常用选项:
  1. # 指定安装路径(默认通常是/usr/local)
  2. ./configure --prefix=/opt/nginx
  3. # 启用特定功能
  4. ./configure --with-http_ssl_module
  5. # 禁用特定功能
  6. ./configure --without-http_gzip_module
  7. # 指定依赖库路径
  8. ./configure --with-openssl=/usr/local/openssl
  9. # 启用调试信息
  10. ./configure --enable-debug
复制代码

环境变量设置

有时我们需要通过环境变量来影响编译过程:
  1. # 设置编译器
  2. export CC=gcc
  3. export CXX=g++
  4. # 设置编译选项
  5. export CFLAGS="-O2 -Wall"
  6. export CXXFLAGS="-O2 -Wall"
  7. # 然后运行configure
  8. ./configure
复制代码

配置示例

以Nginx为例,一个典型的配置可能如下:
  1. ./configure \
  2. --prefix=/usr/local/nginx \
  3. --sbin-path=/usr/local/nginx/sbin/nginx \
  4. --conf-path=/usr/local/nginx/conf/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. --with-http_ssl_module \
  10. --with-http_v2_module \
  11. --with-http_realip_module \
  12. --with-http_gzip_static_module \
  13. --with-pcre \
  14. --with-openssl=/usr/local/openssl
复制代码

编译过程

配置完成后,就可以开始编译源码了。编译过程主要是通过make命令来完成的。

基本编译
  1. make
复制代码

并行编译

现代CPU通常有多个核心,我们可以通过-j参数指定并行编译的线程数,以加快编译速度:
  1. # 自动检测CPU核心数并设置并行编译
  2. make -j$(nproc)
  3. # 或者手动指定线程数
  4. make -j4
复制代码

指定编译目标

有些软件的Makefile包含多个目标,可以指定编译特定目标:
  1. # 编译特定目标
  2. make all
  3. make program
复制代码

编译过程中的常见问题

编译过程中可能会遇到各种错误,常见问题及解决方案:

错误信息示例:
  1. fatal error: openssl/ssl.h: No such file or directory
复制代码

解决方案:安装对应的开发包
  1. sudo yum install -y openssl-devel
复制代码

错误信息示例:
  1. /usr/bin/ld: cannot find -lssl
复制代码

解决方案:安装对应的库文件或指定库文件路径
  1. sudo yum install -y openssl-devel
  2. # 或者指定库文件路径
  3. export LDFLAGS="-L/usr/local/openssl/lib"
  4. make
复制代码

有时源码需要特定版本的编译器,可以通过安装特定版本或设置环境变量解决:
  1. # 安装特定版本的gcc(以CentOS 7为例)
  2. sudo yum install -y devtoolset-7-gcc devtoolset-7-gcc-c++
  3. # 启用特定版本的gcc
  4. scl enable devtoolset-7 bash
  5. # 然后重新编译
  6. make clean
  7. make
复制代码

安装过程

编译成功后,就可以安装软件了。安装过程通常也是通过make命令完成的。

基本安装
  1. make install
复制代码

指定安装目标

有些Makefile提供多个安装目标:
  1. # 安装到指定位置
  2. make install DESTDIR=/tmp/nginx
  3. # 只安装特定部分
  4. make install-bin
  5. make install-man
复制代码

安装后的配置

安装完成后,通常需要进行一些配置才能使用软件:
  1. # 创建符号链接到PATH环境变量包含的目录
  2. sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
  3. # 创建系统服务(以nginx为例)
  4. sudo tee /etc/systemd/system/nginx.service > /dev/null <<EOF
  5. [Unit]
  6. Description=The NGINX HTTP and reverse proxy server
  7. After=syslog.target network.target remote-fs.target nss-lookup.target
  8. [Service]
  9. Type=forking
  10. PIDFile=/var/run/nginx.pid
  11. ExecStartPre=/usr/local/nginx/sbin/nginx -t
  12. ExecStart=/usr/local/nginx/sbin/nginx
  13. ExecReload=/usr/local/nginx/sbin/nginx -s reload
  14. ExecStop=/bin/kill -s QUIT \$MAINPID
  15. PrivateTmp=true
  16. [Install]
  17. WantedBy=multi-user.target
  18. EOF
  19. # 重新加载systemd配置
  20. sudo systemctl daemon-reload
  21. # 启动服务
  22. sudo systemctl start nginx
  23. # 设置开机自启
  24. sudo systemctl enable nginx
复制代码

常见问题及解决方案

问题1:configure时提示”C compiler cannot create executables”

原因:可能是缺少必要的编译工具或库文件。

解决方案:
  1. # 重新安装Development Tools
  2. sudo yum groupinstall "Development Tools" -y
  3. # 检查gcc是否正常工作
  4. echo 'int main() { return 0; }' > test.c && gcc test.c -o test && ./test && rm -f test.c test
复制代码

问题2:make时提示”make: *** No targets specified and no makefile found. Stop.”

原因:没有运行configure脚本或configure失败。

解决方案:
  1. # 确保已运行configure
  2. ./configure
  3. # 如果configure失败,检查错误信息并解决
  4. ./configure --help
复制代码

问题3:make时提示”error: ‘FORBIDDEN’ undeclared”

原因:可能是软件版本与系统库版本不兼容。

解决方案:
  1. # 尝试更新系统库
  2. sudo yum update -y
  3. # 或者尝试使用较旧或较新的软件版本
复制代码

问题4:make install时提示”Permission denied”

原因:尝试写入需要root权限的目录。

解决方案:
  1. # 使用sudo运行make install
  2. sudo make install
  3. # 或者指定安装到用户有权限的目录
  4. ./configure --prefix=$HOME/local
  5. make
  6. make install
复制代码

问题5:运行时提示”libxxx.so.x: cannot open shared object file”

原因:系统找不到所需的共享库。

解决方案:
  1. # 安装对应的库文件
  2. sudo yum install -y libxxx-devel
  3. # 或者将库路径添加到ld.so.conf
  4. echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/custom.conf
  5. sudo ldconfig
  6. # 或者设置LD_LIBRARY_PATH环境变量
  7. export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
复制代码

实例演示:编译安装Nginx

让我们通过一个完整的实例来演示如何在CentOS系统下编译安装Nginx。

1. 环境准备
  1. # 更新系统
  2. sudo yum update -y
  3. # 安装开发工具组
  4. sudo yum groupinstall "Development Tools" -y
  5. # 安装Nginx依赖
  6. sudo yum install -y pcre-devel zlib-devel openssl-devel
复制代码

2. 下载并解压Nginx源码
  1. # 下载Nginx
  2. cd /usr/local/src
  3. wget https://nginx.org/download/nginx-1.20.2.tar.gz
  4. # 解压
  5. tar -zxvf nginx-1.20.2.tar.gz
  6. cd nginx-1.20.2
复制代码

3. 配置编译选项
  1. ./configure \
  2. --prefix=/usr/local/nginx \
  3. --sbin-path=/usr/local/nginx/sbin/nginx \
  4. --conf-path=/usr/local/nginx/conf/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. --with-http_ssl_module \
  10. --with-http_v2_module \
  11. --with-http_realip_module \
  12. --with-http_gzip_static_module \
  13. --with-pcre
复制代码

4. 编译
  1. # 使用多线程编译
  2. make -j$(nproc)
复制代码

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

6. 创建系统服务
  1. # 创建nginx用户
  2. sudo useradd -r -s /sbin/nologin nginx
  3. # 创建systemd服务文件
  4. sudo tee /etc/systemd/system/nginx.service > /dev/null <<EOF
  5. [Unit]
  6. Description=The NGINX HTTP and reverse proxy server
  7. After=syslog.target network.target remote-fs.target nss-lookup.target
  8. [Service]
  9. Type=forking
  10. PIDFile=/var/run/nginx.pid
  11. ExecStartPre=/usr/local/nginx/sbin/nginx -t
  12. ExecStart=/usr/local/nginx/sbin/nginx
  13. ExecReload=/usr/local/nginx/sbin/nginx -s reload
  14. ExecStop=/bin/kill -s QUIT \$MAINPID
  15. PrivateTmp=true
  16. [Install]
  17. WantedBy=multi-user.target
  18. EOF
  19. # 重新加载systemd配置
  20. sudo systemctl daemon-reload
  21. # 启动Nginx
  22. sudo systemctl start nginx
  23. # 设置开机自启
  24. sudo systemctl enable nginx
复制代码

7. 验证安装
  1. # 检查Nginx版本
  2. /usr/local/nginx/sbin/nginx -v
  3. # 检查Nginx状态
  4. sudo systemctl status nginx
  5. # 测试Nginx是否正常工作
  6. curl -I http://localhost
复制代码

8. 配置防火墙(如果需要)
  1. # 开放HTTP和HTTPS端口
  2. sudo firewall-cmd --permanent --add-service=http
  3. sudo firewall-cmd --permanent --add-service=https
  4. sudo firewall-cmd --reload
复制代码

实例演示:编译安装Python

再以Python为例,演示如何从源码编译安装。

1. 环境准备
  1. # 更新系统
  2. sudo yum update -y
  3. # 安装开发工具组
  4. sudo yum groupinstall "Development Tools" -y
  5. # 安装Python依赖
  6. sudo yum install -y openssl-devel bzip2-devel libffi-devel zlib-devel readline-devel sqlite-devel gdbm-devel db4-devel libpcap-devel xz-devel
复制代码

2. 下载并解压Python源码
  1. # 下载Python
  2. cd /usr/local/src
  3. wget https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz
  4. # 解压
  5. tar -zxvf Python-3.9.7.tgz
  6. cd Python-3.9.7
复制代码

3. 配置编译选项
  1. # 配置
  2. ./configure --enable-optimizations --prefix=/usr/local/python3.9
复制代码

4. 编译
  1. # 使用多线程编译
  2. make -j$(nproc)
复制代码

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

6. 创建符号链接
  1. # 创建python3符号链接
  2. sudo ln -s /usr/local/python3.9/bin/python3.9 /usr/local/bin/python3.9
  3. # 创建pip3符号链接
  4. sudo ln -s /usr/local/python3.9/bin/pip3.9 /usr/local/bin/pip3.9
复制代码

7. 验证安装
  1. # 检查Python版本
  2. python3.9 --version
  3. # 检查pip版本
  4. pip3.9 --version
复制代码

总结与建议

源码编译安装软件是Linux系统管理中的一项重要技能,它提供了比包管理器更多的灵活性和控制权。通过本文的介绍,你应该已经掌握了在CentOS系统下从源码编译安装软件的基本流程和技巧。

最佳实践

1. 保持系统更新:在编译前确保系统是最新的,以避免兼容性问题。
2. 使用并行编译:利用多核CPU的优势,使用make -j$(nproc)加速编译过程。
3. 指定安装路径:使用--prefix选项指定安装路径,便于管理和卸载。
4. 记录编译选项:保存使用的configure选项,以便将来重新编译或移植到其他系统。
5. 检查依赖关系:在编译前仔细阅读软件的安装文档,确保所有依赖都已安装。

安全考虑

1. 验证源码完整性:下载源码后,验证其MD5、SHA1或SHA256校验和,确保源码未被篡改。
2. 使用非root用户编译:尽量使用普通用户进行编译,只在需要时使用sudo权限。
3. 限制编译权限:如果可能,在编译完成后移除不必要的编译工具,减少系统攻击面。

故障排除

1. 仔细阅读错误信息:编译过程中的错误信息通常包含解决问题的线索。
2. 查阅文档:大多数软件都有详细的安装文档,可能包含特定于某些发行版的说明。
3. 搜索已知问题:在软件的GitHub仓库、邮件列表或论坛中搜索类似问题。
4. 简化配置:如果遇到问题,尝试使用最简单的配置选项,然后逐步添加功能。

通过掌握源码编译的技能,你将能够更好地控制你的Linux系统,安装最新版本的软件,以及根据需要自定义软件功能。希望本文能够帮助你在CentOS系统下顺利地进行源码编译安装。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

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

本版积分规则