#在 CentOS 7 中手动编译安装软件操作及原理

在 CentOS 7 中,手动编译安装软件(即从源代码编译安装)是一种高度灵活的方式,适用于需要定制化软件功能、优化性能或安装官方仓库未提供的软件版本的场景。以下是针对手动编译安装的详细说明,包括原理、步骤、注意事项和示例,以确保清晰易懂,并深入解释每个步骤的背景和作用。


手动编译安装的原理

手动编译安装是指从软件的源代码(通常为 C、C++ 或其他语言编写的代码)开始,通过编译工具将其转换为适用于当前系统的二进制可执行文件,并安装到指定目录。以下是核心原理:

  1. 源码到二进制的转换:

    • 源代码是开发者编写的文本文件(如 .c、.cpp),需要通过编译器(如 gcc、g++)转换为机器码,形成可执行文件。

    • 编译过程包括预处理、编译、汇编和链接四个阶段,最终生成二进制文件。

  2. 定制化与环境适配:

    • 编译时可以指定参数(如安装路径、启用/禁用功能模块),以满足特定需求。

    • 编译生成的文件针对当前系统架构(如 x86_64)优化,性能可能优于通用 RPM 包。

  3. 依赖管理:

    • 源码依赖外部库(如 openssl、zlib),需提前安装这些库的开发版本(以 -devel 结尾的包,包含头文件和静态库)。

    • 依赖未满足会导致配置或编译失败。

  4. 安装路径:

    • 编译后的文件通常安装到用户指定的目录(如 /usr/local),而不是 RPM 管理的系统目录(如 /usr/bin)。

    • 不记录到 RPM 数据库,卸载需手动删除。

  5. 工具链:

    • 配置工具:如 configure 脚本,检查系统环境、依赖并生成 Makefile。

    • 编译工具:make 根据 Makefile 执行编译。

    • 安装工具:make install 将编译结果复制到目标目录。


手动编译安装的详细步骤

以下是手动编译安装软件的通用步骤,以安装 Nginx(一个高性能 Web 服务器)为例,逐步说明每个步骤的目的和操作。

步骤 1:安装编译工具和基础依赖

目的

提供编译和构建所需的工具(如 gcc、make)及常见开发库,确保源码能够成功编译。

操作

  1. 安装开发工具组:

    yum groupinstall "Development Tools" -y
    • 包含 gcc(C 编译器)、g++(C++ 编译器)、make(构建工具)、autoconf 等。

  2. 安装 Nginx 常见依赖的开发库:

    yum install pcre-devel openssl-devel zlib-devel -y
    • pcre-devel:支持正则表达式(Nginx 的 URL 重写需要)。

    • openssl-devel:支持 HTTPS(SSL/TLS 模块)。

    • zlib-devel:支持 gzip 压缩。

原理

  • 开发工具提供编译和链接功能,-devel 包提供头文件(.h)和库文件(.a 或 .so),供源码引用。

  • 缺少这些依赖会导致 ./configure 或 make 失败。

步骤 2:下载源码

目的

获取目标软件的源代码,通常以压缩包形式(如 .tar.gz)提供。

操作

  1. 从软件官网下载源码:

    wget http://nginx.org/download/nginx-1.18.0.tar.gz
    • 可替换版本号(如 1.20.2)或从 GitHub 获取最新代码。

  2. 验证文件完整性(可选):

    • 如果官网提供校验和(如 MD5 或 SHA256),验证下载文件:

      sha256sum nginx-1.18.0.tar.gz

原理

  • 源码包包含源代码(.c 文件)、配置脚本(configure)和文档。

  • 确保下载来源可靠,避免恶意代码。

步骤 3:解压源码并进入目录

目的

解压源码包,进入工作目录以进行后续配置和编译。

操作

  1. 解压:

    tar -zxvf nginx-1.18.0.tar.gz
    • -z:通过 gzip 解压;-x:提取;-v:显示过程;-f:指定文件。

  2. 进入目录:

    cd nginx-1.18.0

原理

  • 解压后生成包含源代码和脚本的目录。

  • 源码目录通常包含 configure 脚本、src 目录(源代码)、docs(文档)等。

步骤 4:配置编译环境

目的

运行 configure 脚本,检查系统环境、依赖并生成 Makefile,为编译做准备。

操作

  1. 执行配置脚本:

    ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_gzip_static_module
    • --prefix=/usr/local/nginx:指定安装目录。

    • --with-http_ssl_module:启用 HTTPS 支持。

    • --with-http_gzip_static_module:启用静态 gzip 压缩。

    • 可通过 ./configure --help 查看更多选项。

  2. 检查输出:

    • 如果缺少依赖,脚本会报错,如 openssl not found。

    • 安装缺失的 -devel 包后重新运行。

原理

  • configure 是一个 shell 脚本,执行以下任务:

    • 检查编译器(gcc)和工具(make)是否存在。

    • 检测依赖库和头文件(如 openssl.h)。

    • 根据参数生成 Makefile,定义编译规则和安装路径。

  • 如果依赖缺失,需安装对应的 -devel 包,例如:

    yum install openssl-devel

步骤 5:编译源码

目的

使用 make 工具根据 Makefile 编译源代码,生成二进制文件。

操作

  1. 运行编译:

    make
    • 可能需要几分钟,视机器性能和源码大小而定。

  2. 检查错误:

    • 如果报错(如缺失头文件),查看错误信息,安装缺失依赖后重新运行。

原理

  • make 读取 Makefile,按顺序执行:

    • 预处理:处理宏和条件编译。

    • 编译:将 .c 文件编译为 .o(对象文件)。

    • 链接:将 .o 文件和库链接为可执行文件。

  • 编译结果通常存储在源码目录的 objs 子目录中(如 Nginx 的 objs/nginx)。

步骤 6:安装编译结果

目的

将编译生成的二进制文件、配置文件和文档复制到指定安装目录。

操作

  1. 安装:

    make install
    • 将文件复制到 /usr/local/nginx(由 --prefix 指定)。

  2. 检查安装目录:

    ls /usr/local/nginx
    • 通常包含:

      • sbin/nginx:Nginx 可执行文件。

      • conf/nginx.conf:配置文件。

      • html/:默认网页目录。

      • logs/:日志目录。

原理

  • make install 执行 Makefile 中的安装规则,将文件复制到目标路径。

  • 可能需要 root 权限(使用 sudo),因为写入系统目录(如 /usr/local)受限。

步骤 7:配置与启动软件

目的

配置软件参数并启动,确保正常运行。

操作

  1. 编辑 Nginx 配置文件:

    vi /usr/local/nginx/conf/nginx.conf
    • 按需修改监听端口(如 listen 80)、服务器名称等。

  2. 启动 Nginx:

    /usr/local/nginx/sbin/nginx
  3. 验证运行:

    bash

    curl http://localhost
    • 应返回默认欢迎页面。

原理

  • 软件启动需要加载配置文件,初始化运行环境。

  • Nginx 使用配置文件定义监听端口、虚拟主机等。

步骤 8:设置开机启动(可选)

目的

确保软件随系统启动自动运行,适合服务器环境。

操作

  1. 创建 systemd 服务文件 /etc/systemd/system/nginx.service:

    [Unit]
    Description=Nginx Web Server
    After=network.target[Service]
    Type=forking
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop
    PrivateTmp=true[Install]
    WantedBy=multi-user.target
  2. 启用并启动服务:

    systemctl enable nginx
    systemctl start nginx
  3. 验证状态:

    systemctl status nginx

原理

  • systemd 是 CentOS 7 的服务管理工具,通过 .service 文件定义服务的启动、停止和重载行为。

  • Type=forking 适合 Nginx 这种后台运行的进程。


完整示例:安装 Nginx

以下是完整的命令序列,假设 CentOS 7 最小化安装:

# 安装编译工具和依赖
yum groupinstall "Development Tools" -y
yum install pcre-devel openssl-devel zlib-devel -y# 下载并解压 Nginx 源码
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0# 配置编译环境
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_gzip_static_module# 编译并安装
make
make install# 启动 Nginx
/usr/local/nginx/sbin/nginx# 验证
curl http://localhost# 设置开机启动
cat << EOF > /etc/systemd/system/nginx.service
[Unit]
Description=Nginx Web Server
After=network.target[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true[Install]
WantedBy=multi-user.target
EOFsystemctl enable nginx
systemctl start nginx

注意事项

  1. 依赖管理:

    • 每次 ./configure 失败时,检查错误信息,安装缺失的 -devel 包。

    • 常见依赖库包括 libxml2-devel、libxslt-devel(XML 处理)、gd-devel(图像处理)等。

  2. 编译优化:

    • 可通过 ./configure 参数启用优化,如 --with-cc-opt="-O2" 提高性能。

    • 针对 CPU 架构优化:--with-cpu-opt=amd64。

  3. 错误调试:

    • 配置失败:查看 config.log 获取详细错误。

    • 编译失败:检查 make 输出,可能是代码错误或依赖问题。

    • 运行失败:检查软件日志(如 /usr/local/nginx/logs/error.log)。

  4. 卸载:

    • 源码安装不记录到 RPM 数据库,卸载需手动删除:

      rm -rf /usr/local/nginx
      systemctl disable nginx
      rm /etc/systemd/system/nginx.service
    • 清理源码目录:

      rm -rf nginx-1.18.0
  5. 权限与安全:

    • 编译和安装可能需要 root 权限,使用 sudo。

    • 避免以 root 运行服务,Nginx 默认以 nobody 用户运行。

    • 确保源码来源可靠(如官网),避免安全风险。

  6. 内存与性能:

    • 1GB 内存足以编译小型软件(如 Nginx),但大型软件(如 MySQL)可能需要更多内存或交换分区。

    • 编译时间取决于 CPU 性能,可用 make -j$(nproc) 并行编译加速。


常见问题与解决方案

  1. 问题:./configure 报错 cannot find OpenSSL。

    • 解决:安装 openssl-devel:

      yum install openssl-devel
  2. 问题:make 失败,提示缺少头文件。

    • 解决:根据错误信息安装对应 -devel 包,例如:

      yum install pcre-devel
  3. 问题:make install 权限不足。

    • 解决:使用 sudo:

      sudo make install
  4. 问题:Nginx 启动失败,提示端口占用。

    • 解决:检查端口 80 是否被占用:

      netstat -tulnp | grep :80
    • 杀死占用进程或修改 nginx.conf 使用其他端口。


适用场景

  • 需要特定版本:官方仓库版本过旧(如 CentOS 7 的 Nginx 可能为 1.16,需最新 1.20)。

  • 定制化需求:启用特定模块(如 Nginx 的 GeoIP 模块)或优化编译参数。

  • 无 RPM 包:某些软件(如最新 Redis 或实验性工具)未提供 RPM 包。

  • 离线环境:源码下载后可在无网络环境编译。


扩展:其他软件的编译安装

以下是其他常见软件的编译安装要点,基于 CentOS 7:

安装 Redis

  1. 依赖:

    yum install gcc make
  2. 下载并编译:

    wget http://download.redis.io/releases/redis-6.2.6.tar.gz
    tar -zxvf redis-6.2.6.tar.gz
    cd redis-6.2.6
    make
    make install PREFIX=/usr/local/redis
  3. 启动:

    /usr/local/redis/bin/redis-server

安装 MySQL

  1. 依赖:

    yum install gcc cmake ncurses-devel openssl-devel
  2. 下载并编译:

    wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.36.tar.gz
    tar -zxvf mysql-5.7.36.tar.gz
    cd mysql-5.7.36
    cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_INNODB_MEMCACHED=1
    make
    make install
  3. 初始化并启动:

    /usr/local/mysql/bin/mysqld --initialize --user=mysql
    /usr/local/mysql/bin/mysql.server start

总结

手动编译安装在 CentOS 7 中是一个强大的工具,适合需要高度控制的场景。核心步骤包括安装工具、下载源码、配置、编译、安装和配置服务。通过合理管理依赖和调试错误,可以高效完成安装。Nginx 的示例展示了典型流程,其他软件(如 Redis、MySQL)遵循类似步骤,但依赖和配置参数不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

菊厂0510面试手撕题目解答

题目 输入一个整数数组&#xff0c;返回该数组中最小差出现的次数。 示例1&#xff1a;输入&#xff1a;[1,3,7,5,9,12]&#xff0c;输出&#xff1a;4&#xff0c;最小差为2&#xff0c;共出现4次&#xff1b; 示例2&#xff1a;输入&#xff1a;[90,98,90,90,1,1]&#xf…

C——五子棋小游戏

前言 五子棋&#xff0c;又称连珠棋&#xff0c;是一种双人对弈的棋类游戏。游戏目标是在一个棋盘上&#xff0c;通过在横、竖、斜线上依次放置棋子&#xff0c;使自己的五个棋子连成一线&#xff0c;即横线、竖线或斜线&#xff0c;且无被对手堵住的空位&#xff0c;从而获胜…

ik 分词器 设置自定义词典

进入 ES 的安装目录&#xff0c;进入 /elasticsearch-8.10.0/plugins/ik/config/ 文件夹目录&#xff0c;打开 IKAnalyzer.cfg.xml 文件进行配置。 一、添加 自定义扩展词典 扩展词&#xff1a;就是不想哪些词分开&#xff0c;让他们成为一个词&#xff0c;比如“蒙的全是对…

Linux笔记---信号(上)

1. 信号的概念 Linux下的信号机制是一种进程间通信&#xff08;IPC&#xff09;的方式&#xff0c;用于在不同进程之间传递信息。 信号是一种异步的信息传递方式&#xff0c;这意味着发送信号的进程只发送由信号作为载体的命令&#xff0c;而并不关心接收信号的进程如何处置这…

UG 二次开发- UG内部调用DLL

【1】用VS新建一个dll工程 将项目设置为x64平台&#xff08;这步很重要&#xff0c;否则程序无法编译成功&#xff09; 【2】添加UG头文件目录&#xff0c;属性页->C/C->常规->附加包含目录 【3】添加UG库所在目录&#xff0c;属性页->链接器->常规->附加库目…

wordcount在mapreduce的例子

1.启动集群 2.创建项目 项目结构为&#xff1a; 3.pom.xml文件为 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://mave…

智慧城市综合运营管理系统Axure原型

这款Axure原型的设计理念紧紧围绕城市管理者的需求展开。它旨在打破传统城市管理中信息孤岛的局面&#xff0c;通过统一标准接入各类业务系统&#xff0c;实现城市运营管理信息资源的全面整合与共享。以城市管理者为中心&#xff0c;为其提供一个直观、便捷、高效的协同服务平台…

Go语言:json 作用和语法

在 Go 语言中&#xff0c;JSON 字段&#xff08;也称为 JSON Tag&#xff09;是附加在结构体字段上的元数据&#xff0c;用于控制该字段在 JSON 编码&#xff08;序列化&#xff09;和解码&#xff08;反序列化&#xff09; 时的行为。它的语法是&#xff1a; type StructName…

MATLAB复制Excel数据到指定区域

Matlab中如何将Excel表中的265-528行F-AA列数据复制到1-263行AE-AZ中 版本&#xff1a;MatlabR2018b clc; clear; %旧Excel文件名 oldFile ; %新Excel文件名 newFile ; % 工作表名称&#xff08;旧表和新表一致&#xff09; sheetName Sheet1; % 旧文件中待复制的数据范…

vue3+flask+sqlite前后端项目实战

基础环境安装 pycharm 下载地址&#xff1a; https://www.jetbrains.com/zh-cn/pycharm/download/?sectionwindows vscode 下载地址 https://code.visualstudio.com/docs/?dvwin64user python 下载地址 https://www.python.org/downloads/windows/ Node.js&#xff08;含npm…

Java 内存模型(JMM)与内存屏障:原理、实践与性能权衡

Java 内存模型&#xff08;JMM&#xff09;与内存屏障&#xff1a;原理、实践与性能权衡 在多线程高并发时代&#xff0c;Java 内存模型&#xff08;JMM&#xff09; 及其背后的内存屏障机制&#xff0c;是保障并发程序正确性与性能的基石。本文将系统梳理 JMM 的核心原理、内…

动手学深度学习12.3.自动并行-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;无 本节教材地址&#xff1a;12.3. 自动并行 — 动手学深度学习 2.0.0 documentation 本节开源代…

C++类和对象之初始化列表

初始化列表 C初始化列表详解&#xff1a;性能优化与正确实践什么是初始化列表&#xff1f;初始化列表的三大核心作用1. 性能优化&#xff1a;避免不必要的赋值操作2. 强制初始化&#xff1a;处理const和引用成员3. 基类初始化&#xff1a;正确调用父类构造函数4.必须使用初始化…

continue通过我们的开源 IDE 扩展和模型、规则、提示、文档和其他构建块中心,创建、共享和使用自定义 AI 代码助手

​一、软件介绍 文末提供程序和源码下载 Continue 使开发人员能够通过我们的开源 VS Code 和 JetBrains 扩展以及模型、规则、提示、文档和其他构建块的中心创建、共享和使用自定义 AI 代码助手。 二、功能 Chat 聊天 Chat makes it easy to ask for help from an LLM without…

基于Spring Boot + Vue的母婴商城系统( 前后端分离)

一、项目背景介绍 随着母婴行业在互联网平台的快速发展&#xff0c;越来越多的家庭倾向于在线选购母婴产品。为了提高商品管理效率和用户购物体验&#xff0c;本项目开发了一个基于 Spring Boot Vue 技术栈的母婴商城系统&#xff0c;实现了商品分类、商品浏览、资讯展示、评…

实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API

实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API 理论千遍,不如动手一遍!在前面几篇文章中,我们了解了 Serverless 的概念、FaaS 的核心原理以及 BaaS 的重要作用。现在,是时候把这些知识运用起来,亲手构建一个简单但完整的 Serverless 应用了。 …

node.js 实战——express图片保存到本地或服务器(七牛云、腾讯云、阿里云)

本地 ✅ 使用formidable 读取表单内容 npm i formidable ✅ 使用mime-types 获取图片后缀 npm install mime-types✅ js 中提交form表单 document.getElementById(uploadForm).addEventListener(submit, function(e){e.preventDefault();const blob preview._blob;if(!blob)…

2025最新:3分钟使用Docker快速部署单节点Redis

&#x1f9d1;‍&#x1f3eb; 详细教程&#xff1a;通过 Docker 安装单节点 Redis &#x1f6e0;️ 前提条件&#xff1a; 你需要在 Ubuntu 系统上进行操作&#xff08;如果你在其他系统上操作&#xff0c;可以按相似步骤进行调整&#xff09;。已安装 Docker 和 Docker Com…

CentOS 7 系统下安装 OpenSSL 1.0.2k 依赖问题的处理

前面有提到过这个openssl的版本冲突问题&#xff0c;也是在这次恢复服务器时遇到的问题&#xff0c;我整理如下&#xff0c;供大家参考。小小一个软件的安装&#xff0c;挺坑的。 一、问题 项目运行环境需要&#xff0c;指定PHP7.0.9这个版本&#xff0c;但是‌系统版本与软件…

LoRA(Low-Rank Adaptation)原理详解

LoRA(Low-Rank Adaptation)原理详解 LoRA(低秩适应)是一种参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)技术,旨在以极低的参数量实现大模型在特定任务上的高效适配。其核心思想基于低秩分解假设,即模型在适应新任务时,参数更新矩阵具有低秩特性,可用少量参…