#在 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.pswp.cn/bicheng/80691.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80691.shtml
英文地址,請注明出處:http://en.pswp.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)技術,旨在以極低的參數量實現大模型在特定任務上的高效適配。其核心思想基于低秩分解假設,即模型在適應新任務時,參數更新矩陣具有低秩特性,可用少量參…