Linux C語言調用第三方庫,第三方庫如何編譯安裝

在 Linux 環境下使用 C 語言調用第三方庫時,通常需要先對第三方庫進行編譯和安裝。以下為你詳細介紹一般的編譯安裝步驟,并給出不同類型第三方庫(如使用 Makefile、CMake 構建系統)的具體示例。

一般步驟

1. 獲取第三方庫源碼

一般可以從官方網站、代碼托管平臺(如 GitHub)等渠道下載第三方庫的源代碼壓縮包,下載后將其解壓到合適的目錄。例如,使用 wget 下載并解壓:

wget https://example.com/library.tar.gz
tar -zxvf library.tar.gz
cd library
包管理器安裝(可選)

若庫已收錄在系統倉庫,可直接通過包管理器安裝:

sudo apt install libexample-dev  # Debian/Ubuntu
sudo yum install libexample-devel  # CentOS/RHEL

2. 配置編譯環境

有些庫需要根據系統環境進行一些配置,常見的配置方式有使用 configure 腳本或 CMake 工具。

3. 編譯源碼

根據配置結果,使用相應的編譯工具(如 make)對源碼進行編譯。

4. 安裝庫文件

編譯完成后,將生成的庫文件、頭文件等安裝到系統指定的目錄,方便后續使用。

不同構建系統的編譯安裝示例

使用 configure 和 make 構建的庫

很多傳統的開源庫使用 configure 腳本來進行配置,然后使用 make 進行編譯和安裝。以下以一個示例庫 example-library 為例:

# 進入庫的源碼目錄
cd example-library# 運行 configure 腳本進行配置,該腳本會檢查系統環境,確定編譯所需的參數和依賴項,并生成相應的 Makefile 文件
./configure
./configure --prefix=/usr/local  # 指定安裝到 /usr/local# 編譯源碼,根據 Makefile 文件中的規則編譯源碼,生成庫文件和可執行文件。
make
make -j4  # 啟用4線程加速編譯# 安裝庫文件到系統目錄(如 /usr/local/lib、/usr/local/include 等)
sudo make install

常用參數:
–enable-shared:生成動態庫(.so)
–disable-static:禁用靜態庫(.a)
默認安裝路徑:
頭文件:/usr/local/include
庫文件:/usr/local/lib

使用 CMake 構建的庫

現代的開源項目很多使用 CMake 來管理構建過程。以下是使用 CMake 構建庫的示例:

# 進入庫的源碼目錄
cd example-library# 創建一個獨立的構建目錄,避免污染源碼目錄。
mkdir build
cd build# 在構建目錄中運行 cmake 命令,指定源碼目錄為上一級目錄(..),生成 Makefile 文件。
cmake ..# 根據生成的 Makefile 編譯源碼。
make# 將編譯好的庫文件、頭文件等安裝到系統的標準目錄。
sudo make install

其他注意事項

依賴項安裝

在編譯第三方庫之前,需要確保系統已經安裝了該庫所需的依賴項。可以通過包管理器(如 apt、yum 等)來安裝這些依賴項。例如,如果庫依賴于 openssl,可以使用以下命令安裝:

# Ubuntu/Debian 系統
sudo apt-get install libssl-dev# CentOS/RHEL 系統
sudo yum install openssl-devel

自定義安裝路徑

如果不想將庫安裝到系統的標準目錄,可以在配置時指定自定義的安裝路徑。例如,使用 configure 腳本時可以使用 --prefix 選項:

./configure --prefix=/path/to/install

使用 CMake 時可以使用 -DCMAKE_INSTALL_PREFIX 選項:

cmake -DCMAKE_INSTALL_PREFIX=/path/to/install ..

環境變量配置

安裝完成后,如果庫安裝在非標準路徑,可能需要配置環境變量,以便系統能夠找到這些庫文件。可以通過設置 LD_LIBRARY_PATH 環境變量來實現:

export LD_LIBRARY_PATH=/path/to/install/lib:$LD_LIBRARY_PATH

為了使環境變量永久生效,可以將上述命令添加到 ~/.bashrc 或 ~/.bash_profile 文件中。

三、配置開發環境

頭文件路徑

編譯時通過 -I 指定頭文件目錄:

gcc -I/usr/local/include -c main.c

庫文件路徑

鏈接時通過 -L 指定庫目錄,-l 指定庫名(去除前綴 lib 和后綴):

gcc main.o -o app -L/usr/local/lib -lexample

運行時動態庫路徑

臨時生效(終端會話內):

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

永久生效:

echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/custom.conf
sudo ldconfig

在這里插入圖片描述

五、驗證安裝

測試程序

#include <example.h>  // 包含第三方庫頭文件
int main() {example_function();  // 調用庫函數return 0;
}

編譯并運行:

gcc -o test test.c -lexample && ./test

常見問題解決

?權限不足:安裝時使用 sudo 提權
?頭文件未找到:檢查 -I 路徑或手動復制頭文件到 /usr/include
?鏈接失敗:確認庫名拼寫正確,或通過 ldd app 檢查依賴
通過以上步驟,可系統性地完成第三方庫的編譯安裝與調用。具體實現細節需結合庫的官方文檔調整

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73828.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73828.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73828.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux基本命令(1)--linux下的打包命令 -- tar 和gzip

tar 解壓 &#xff0c;打包 語法&#xff1a;tar [主選項輔選項] 文件或者目錄 使用該命令時&#xff0c;主選項是必須要有的&#xff0c;它告訴tar要做什么事情&#xff0c;輔選項是輔助使用的&#xff0c;可以選用。 主選項&#xff1a; c 創建新的檔案文件。如果用戶想備…

Python 序列構成的數組(對序列使用+和_)

對序列使用和* Python 程序員會默認序列是支持 和 * 操作的。通常 號兩側的序列由 相同類型的數據所構成&#xff0c;在拼接的過程中&#xff0c;兩個被操作的序列都不會被 修改&#xff0c;Python 會新建一個包含同樣類型數據的序列來作為拼接的結果。 如果想要把一個序列…

[ C語言 ] | 從0到1?

目錄 認識計算機語言 C語言 工欲善其事必先利其器 第一個C語言代碼 這一些列 [ C語言 ] &#xff0c;就來分享一下 C語言 相關的知識點~ 認識計算機語言 我們說到計算機語言&#xff0c;語言&#xff0c;就是用來溝通的工具&#xff0c;計算機語言呢&#xff1f;就是我們…

【通道注意力機制】【SENet】Squeeze-and-Excitation Networks

0.論文摘要 卷積神經網絡建立在卷積操作的基礎上&#xff0c;通過融合局部感受野內的空間和通道信息來提取有意義的特征。為了增強網絡的表示能力&#xff0c;最近的一些方法展示了增強空間編碼的好處。在本研究中&#xff0c;我們專注于通道關系&#xff0c;并提出了一種新穎…

kubernetes Calico(CNI) NetworkPolicy 流量管理 設置networkpolicy 策略 下集

1、kubernetes 網絡策略&#xff08;網絡隔離策略&#xff09; Network Policy 是 Kubernetes 中用于控制 Pod 之間網絡通信的一種機制。它通過定義規則&#xff0c;限制哪些 Pod 或外部實體可以與目標 Pod 通信&#xff08;基于標簽、命名空間、端口等&#xff09;。Network …

sqlmap基礎命令總結

?注意事項:僅用于授權測試&#xff0c;避免非法使用。 目錄 ?一、基礎命令 ?二、數據庫信息獲取 ?三、繞過 WAF/IDS ?四、文件系統與系統命令 ?五、高級功能與優化 ?六、實戰示例 ?一、基礎命令 ?檢測注入點 sqlmap -u "http://target.com/index.php?id1&…

Unity光線傳播體積(LPV)技術實現詳解

一、LPV技術概述 光線傳播體積(Light Propagation Volumes)是一種實時全局光照技術&#xff0c;通過將場景中的間接光信息存儲在3D網格中&#xff0c;實現動態物體的間接光照效果。 核心優勢&#xff1a; 實時性能&#xff1a;相比傳統光照貼圖&#xff0c;支持動態場景 硬件…

SpringBoot (一) 自動配置原理

目錄 一 自動配置 1:數據源的手動配置 1:SpringBoot的自動配置 二 自動配置的完整流程&#xff1a;&#xff08;底層&#xff09; 1. 場景化依賴與Starter機制 2. 主程序入口與注解驅動 3. 自動配置類的加載與篩選 4. 自動配置類的實現邏輯 5. 自動配置的觸發與執行流…

OJ題:移動零

雙指針法 c 語言實現 void moveZeroes(int* nums, int numsSize) {int dest,cur; //創建臨時指針和目標指針destcur0;//出初始化while(cur<numsSize)//遍歷{if(nums[cur]!0){swap(&nums[cur],&nums[dest]);cur;dest;}else{cur;}}} 思路是建立兩個指針&#xff0…

pycharm終端操作遠程服務器

pycharm項目已經連接了遠程服務器&#xff0c;但是打開終端&#xff0c;卻依舊顯示的是本地的那個環境&#xff0c;也就是說沒有操作遠程的那個環境。只能再使用Xshell去操作遠程環境&#xff0c;很麻煩&#xff0c;找了下教程。 來源&#xff1a;https://blog.csdn.net/maolim…

(頭歌作業—python)3.2 個人所得稅計算器(project)

第1關&#xff1a;個人所得稅計算器 任務描述 本關任務&#xff1a;編寫一個個人所得稅計算器的小程序。 相關知識 個人所得稅繳納標準 2018 年 10 月 1 日以前&#xff0c;個稅免征額為 3500 元/月&#xff0c;調整后&#xff0c;個稅免征額為 5000 元/月&#xff0c; 7 級超…

Redis場景問題1:緩存穿透

Redis 緩存穿透是指在緩存系統&#xff08;如 Redis&#xff09;中&#xff0c;當客戶端請求的數據既不在緩存中&#xff0c;也不在數據庫中時&#xff0c;每次請求都會直接穿透緩存訪問數據庫&#xff0c;從而給數據庫帶來巨大壓力&#xff0c;甚至可能導致數據庫崩潰。下面為…

CUDA Memory Fence 函數的功能與硬件實現細節

CUDA Memory Fence 函數的功能與硬件實現細節 Memory Fence 的基本功能 CUDA中的memory fence函數用于控制內存操作的可見性順序&#xff0c;確保在fence之前的內存操作對特定范圍內的線程可見。主要功能包括&#xff1a; 排序內存操作&#xff1a;確保fence之前的內存操作在…

實戰篇Redis

黑馬程序員的Redis的筆記&#xff08;后面補一下圖片&#xff09; 【黑馬程序員Redis入門到實戰教程&#xff0c;深度透析redis底層原理redis分布式鎖企業解決方案黑馬點評實戰項目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…

Reactive編程:什么是Reactive編程?Reactive編程思想

文章目錄 **1. Reactive編程概述****1.1 什么是Reactive編程&#xff1f;****1.1.1 Reactive編程的定義****1.1.2 Reactive編程的歷史****1.1.3 Reactive編程的應用場景****1.1.4 Reactive編程的優勢** **1.2 Reactive編程的核心思想****1.2.1 響應式&#xff08;Reactive&…

異步轉同步,實現一個消息隊列

有一個場景&#xff0c;需要實現一個消息隊列&#xff0c;要求 1&#xff0c;3&#xff0c;4 秒后&#xff0c;依次打印 1&#xff0c;2&#xff0c;3&#xff0c;如下&#xff1a; 其實考察的是怎么用同步的方式實現異步。 本文總結了四種方式實現&#xff1a;常規嵌套、prom…

【Spring Boot 與 Spring Cloud 深度 Mape 之十】體系整合、部署運維與進階展望

【Spring Boot 與 Spring Cloud 深度 Mape 之十】體系整合、部署運維與進階展望 #微服務實戰 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事務 #Seata #ServiceMesh #總結 #SpringCloud #SpringBoot 系列終章&#xff1a;經過前九篇 [【深度 Mape 系列】] 的系統學習…

求職筆試題

PDD 最長公共子序列 1143-最長公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二維動態規劃"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 這種寫法錯誤&#xff0c;m1行…

【MySQL基礎-16】MySQL DELETE語句:深入理解與應用實踐

1. DELETE語句基礎&#xff1a;數據刪除的藝術 在數據庫管理中&#xff0c;DELETE語句是維護數據完整性和清理過期信息的關鍵工具。與日常生活中的"刪除"不同&#xff0c;數據庫中的刪除操作需要更加謹慎和精確&#xff0c;因為數據一旦刪除&#xff0c;恢復可能非常…

python學習筆記(3)——元組

Python3 元組全面詳解 一、元組的定義與特性 基本概念 元組(Tuple)是Python中的不可變序列,用小括號()表示,元素用逗號分隔。與列表不同,元組一旦創建,元素不能修改、添加或刪除(元素本身為可變對象的情況除外)。 不可變性 ? 元組的每個元素的引用不可變,但若元素是可…