Linux操作系統--靜態庫和動態庫的生成and四種解決加載找不到動態庫的四種方法

目錄

必要的知識儲備:

生成靜態庫:

生成動態庫:

解決加載找不到動態庫的四種方法:

第一種:拷貝到系統默認的庫路徑 /usr/lib64/

第二種:在系統默認的庫路徑/usr/lib64/下建立軟鏈接

第三種:將自己的庫所在的路徑,添加到系統的環境變量LD_LIBRARY_PATH中

第四種:/etc/ld.so.conf.d建立自己的動態庫路徑的配置文件,然后重新ldconfig()即可


必要的知識儲備:

  • 靜態庫(.a):程序在編譯鏈接的時候把庫的代碼鏈接到可執行文件中。程序運行的時候將不需要靜態庫
  • 動態庫(.so):程序在運行的時候才去鏈接動態庫的代碼,多個程序共享使用庫的代碼。
  • 一個與動態庫鏈接的可執行文件僅僅包含它用到的函數入口地址的一個表,而不是外部函數所在目標文件的整個機器碼。
  • 在可執行文件開始運行以前,外部函數的機器碼由操作系統從磁盤上的該動態庫中復制到內存中,這個過程稱為動態鏈接。
  • 動態庫可以在多個程序間共享,所以動態鏈接使得可執行文件更小,節省了磁盤空間。操作系統采用虛擬內存機制允許物理內存中的一份動態庫被要用到該庫的所有進程共用,節省了內存和磁盤空間。

生成靜態庫:

靜態庫(.a):程序在編譯鏈接的時候把庫的代碼鏈接到可執行文件中。所以,在和庫的代碼鏈接之前,得把我們的.c文件進行編譯生成.o文件。

gcc -c .c文件名 -o .o文件名

有了.o文件,我們我們就要生成靜態庫

ar -rc libmymath.a mymath.o(.a代表的是靜態庫,rc表示replace、create,就是靜態庫中有同名的就替換,沒有就創建一個新的)

查看靜態庫中的目錄列表:ar -tv libmymath.a(靜態庫名稱)

t:列出靜態庫中的文件

v:verbose 詳細信息

我們創建一個.c文件,去嘗試使用靜態庫

出現第一個問題:明明我們main.c文件已經包含了頭文件,且頭文件也在當前路徑,但是為什么編譯失敗?

編譯失敗就是找不到庫路徑

因為編譯器尋找.c文件里的頭文件直接到系統指定目錄查找頭文件 ,一般用于包含標準庫頭文件。所以找不到庫路徑

gcc main.c -L. -lmymath

-L 指定庫路徑

-l 指定庫名

測試目標文件生成后,靜態庫刪掉,程序照樣可以運行。

庫搜索指定路徑:

  • 從左到右搜索-L指定的目錄。
  • 由環境變量指定的目錄(LIBRARY_PATH)
  • 由系統指定目錄:/usr/lib? ? ? ?/usr/local/lib

把我們提供的方法給別人用,有兩種方法:

  1. 把源文件直接給他
  2. 把源代碼想辦法打包成庫 = 庫 + .h

我們可以用makefile幫助我們更輕松的生成靜態庫

1 lib=libmymath.a2 3 $(lib):mymath.o4     ar -rc $@ $^5 mymath.o:mymath.c6     gcc -c $^7 8 .PHONY:clean9 clean:10     rm -rf *.o *.a lib11 12 .PHONY:output                                                                                                                     13 output:14     mkdir -p lib/include15     mkdir -p lib/mymathlib16     cp *.h lib/include17     cp *.a lib/mymathlib18 

我們平時用的庫如果都是別人成熟的庫,都采用直接安裝到系統的方式

生成動態庫:

gcc -fPIC -c myprint.c

gcc -shared -o libmyprint.so myprint.o

fPIC:產生位置無關碼(可以不了解,可以淺略閱讀下面關于-fPIC知識)

shared:表示生成共享庫格式

庫名規則:libxxx.so

關于-fPIC知識

在使用gcc編譯生成動態庫時,通常需要使用-fPIC(Position Independent Code)選項來生成位置無關的代碼。這是因為動態庫是在加載時動態鏈接到程序中的,而且可能會加載到內存的任意位置,因此需要生成位置無關的代碼,以確保代碼可以正確運行。

具體來說,`-fPIC`選項的作用包括:
1. 生成可重定位的代碼:位置無關代碼可以被加載到任何地址,不會受到地址空間限制。
2. 允許動態庫在內存中共享代碼段:多個程序可以共享同一個動態庫的代碼段,減少內存占用。
3. 支持更靈活的共享庫加載方式:使得動態鏈接更為靈活,可以在程序運行時根據需要加載動態庫。

因此,在生成動態庫時,使用`-fPIC`選項可以確保生成的庫具有位置無關性,適合被動態鏈接到不同程序中使用。

gcc main.c -L. -lmyprint

庫文件名稱和引入庫的名稱

如:lib.c.so->c庫,去掉前綴lib,去掉后綴.so,.a

解決加載找不到動態庫的四種方法:

  1. 拷貝到系統默認的庫路徑 /user/lib64/
  2. 在系統默認的庫路徑/user/lib64/下建立軟鏈接
  3. 將自己的庫所在的路徑,添加到系統的環境變量LD_LIBRARY_PATH中
  4. /etc/ld.so.conf.d建立自己的動態庫路徑的配置文件,然后重新ldconfig()即可

第一種:拷貝到系統默認的庫路徑 /usr/lib64/

第二種:在系統默認的庫路徑/usr/lib64/下建立軟鏈接

第三種:將自己的庫所在的路徑,添加到系統的環境變量LD_LIBRARY_PATH中

第四種:/etc/ld.so.conf.d建立自己的動態庫路徑的配置文件,然后重新ldconfig()即可

系統維護自己的動態庫,配置文件里放的都是路徑

用makefile生成動靜態庫

dy-lib=libmethod.so                                                                                                               2 static-lib=libmymath.a3 4 .PHONY:all5 all: $(dy-lib) $(static-lib)6 7 8 $(static-lib):mymath.o9     ar -rc $@ $^10 mymath.o:mymath.c11     gcc -c $^12 13 $(dy-lib): myprint.o14     gcc -shared -o $@ $^15 myprint.o:myprint.c16     gcc -fPIC -c $^17 18 19 .PHONY:clean20 clean:21     rm -rf *.o *.a *.so mylib22 23 .PHONY:output24 output:25     mkdir -p mylib/include26     mkdir -p mylib/lib27     cp *.h mylib/include28     cp *.a mylib/lib29     cp *.so mylib/lib  

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

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

相關文章

LLM中的N-Gram、TF-IDF和Word embedding

文章目錄 1. N-Gram和TF-IDF:通俗易懂的解析1.1 N-Gram:讓AI學會"猜詞"的技術1.1.1 基本概念1.1.2 工作原理1.1.3 常見類型1.1.4 應用場景1.1.5 優缺點 1.2 TF-IDF:衡量詞語重要性的尺子1.2.1 基本概念1.2.2 計算公式1.2.3 為什么需…

Leetcode 3359. 查找最大元素不超過 K 的有序子矩陣【Plus題】

1.題目基本信息 1.1.題目描述 給定一個大小為 m x n 的二維矩陣 grid。同時給定一個 非負整數 k。 返回滿足下列條件的 grid 的子矩陣數量: 子矩陣中最大的元素 小于等于 k。 子矩陣的每一行都以 非遞增 順序排序。 矩陣的子矩陣 (x1, y1, x2, y2) 是通過選擇…

如何在 Ubuntu 22.04 上安裝、配置、使用 Nginx

如何在 Ubuntu 22.04 上安裝、配置、使用 Nginx?-阿里云開發者社區 更新應用 sudo apt updatesudo apt upgrade檢查必要依賴并安裝 sudo apt install -y curl gnupg2 ca-certificates lsb-release安裝nginx sudo apt install -y nginx# 啟動nginx sudo systemct…

Linux:顯示 -bash-4.2$ 問題(CentOS 7)

文章目錄 一、原因二、錯誤示例三、解決辦法 一、原因 在 CentOS 7 系統中,如果你看到命令行提示符顯示為 -bash-4.2$,一般是 Bash shell 正在運行,并且它沒有找到用戶的個人配置文件,或者這些文件有問題而未能成功加載。這個提示…

QT6 源(34):隨機數生成器類 QRandomGenerator 的源碼閱讀

&#xff08;1&#xff09;代碼來自 qrandom.h &#xff0c;結合官方的注釋&#xff1a; #ifndef QRANDOM_H #define QRANDOM_H#include <QtCore/qalgorithms.h> #include <algorithm> // for std::generate #include <random> // for std::mt1993…

第二篇:linux之Xshell使用及相關linux操作

第二篇&#xff1a;linux之Xshell使用及相關linux操作 文章目錄 第二篇&#xff1a;linux之Xshell使用及相關linux操作一、Xshell使用1、Xshell安裝2、Xshell使用 二、Bash Shell介紹與使用1、什么是Bash Shell(殼)&#xff1f;2、Bash Shell能干什么&#xff1f;3、平時如何使…

MCP(模型上下文協議)學習筆記

學習MCP&#xff08;模型上下文協議&#xff09;的系統化路徑&#xff0c;結合技術原理、工具實踐和社區資源&#xff0c;幫助你高效掌握這一AI交互標準&#xff1a; 在當今人工智能飛速發展的時代&#xff0c;AI技術正以前所未有的速度改變著我們的生活和工作方式。然而&#…

MIR-2025 | 多模態知識助力機器人導航:從復雜環境到高效路徑規劃

作者&#xff1a;Hui Yuan, Yan Huang, Zetao Du, Naigong Yu, Ziqi Liu, Dongbo Zhang, Kun Zhang 單位&#xff1a;北京工業大學信息科學與技術學院&#xff0c;北京工業大學計算智能與智能系統北京市重點實驗室&#xff0c;中科院自動化研究所模式識別國家重點實驗室與多智…

javaSE.泛型界限

現在有一個新的需求&#xff0c;沒有String類型成績了&#xff0c;但是成績依然可能是整數&#xff0c;也可能是小數&#xff0c;這是我們不希望用戶將泛型指定為除數字類型外的其他類型&#xff0c;我們就需要使用到泛型的上界定義&#xff1a; 上界&#x1f447;只能使用其本…

壓縮包網頁預覽(zip-html-preview)

zip-html-preview 項目介紹 這是一個基于 Spring Boot 開發的在線 ZIP 文件預覽工具,主要用于預覽 ZIP 壓縮包中的 HTML 文件及其相關資源。 主要功能 支持拖拽上傳或點擊選擇多個 ZIP 文件自動解壓并提取 ZIP 文件中的 HTML 文件在線預覽 HTML 文件及其相關的 CSS、JavaSc…

QML之Overlay

Overlay&#xff08;覆蓋層&#xff09;是QML中用于在當前界面之上顯示臨時內容的重要組件。 一、Overlay基礎概念 1.1 什么是Overlay&#xff1f; Overlay是一種浮動在現有界面之上的視覺元素&#xff0c;具有以下特點&#xff1a; 臨時顯示&#xff0c;不影響底層布局 通…

iso17025證書申請方法?iso17025認證意義

ISO/IEC 17025證書申請方法 ISO/IEC 17025是檢測和校準實驗室能力的國際標準&#xff0c;申請CNAS認可的流程如下&#xff1a; 1. 前期準備 標準學習&#xff1a;深入理解ISO/IEC 17025:2017標準要求。 差距分析&#xff1a;評估現有實驗室管理與技術能力與標準的差距。 制…

reverse3 1(Base加密)

題目 做法 下載安裝包&#xff0c;解壓&#xff0c;把解壓后的文件拖進Exeinfo PE進行分析 32位&#xff0c;無殼 扔進IDA&#xff08;32位&#xff09;&#xff0c;找到main&#xff0c;F5反編譯 只是因為在人群中多看了你一眼——第31行的right flag&#xff0c;關鍵詞找到…

電控---CMSIS概覽

1. CMSIS庫簡介 CMSIS&#xff08;Cortex Microcontroller Software Interface Standard&#xff0c;Cortex微控制器軟件接口標準&#xff09;是由ARM公司開發的一套標準化軟件接口&#xff0c;旨在為基于ARM Cortex-M系列處理器&#xff08;如Cortex-M0/M0/M3/M4/M7/M33等&am…

list.

列表類型是用來存儲多個有序的字符串&#xff0c;列表中的每個字符串稱為元素&#xff08;element&#xff09;&#xff0c;?個列表最多可以存儲個元素 在 Redis 中&#xff0c;可以對列表兩端插入&#xff08;push&#xff09;和彈出&#xff08;pop&#xff09;&#xff0c;…

關于Diamond機械手的運動學與動力學的推導

1.關于Diamond機械手 &#xff08;1&#xff09;位置模型推導 逆解&#xff1a;機械末端平臺的位置與驅動關節之間的關系。 設p點在xy平面的坐標是&#xff08;x&#xff0c;y&#xff09;T&#xff0c;此時根據向量求解 OP等于向量r等于e向xy軸的向量主動臂長度向xy軸的向量…

如何新建一個空分支(不繼承 master 或任何提交)

一、需求分析&#xff1a; 在 Git 中&#xff0c;我們通常通過 git branch 來新建分支&#xff0c;這些分支默認都會繼承當前所在分支的提交記錄。但有時候我們希望新建一個“完全干凈”的分支 —— 沒有任何提交&#xff0c;不繼承 master 或任何已有內容&#xff0c;這該怎么…

Flask(補充內容)配置SSL 證書 實現 HTTPS 服務

沒有加密的http服務&#xff0c;就像在裸泳&#xff0c;鉆到水里便將你看個精光。數據在互聯網上傳輸時&#xff0c;如果未經加密&#xff0c;隨時可能被抓包軟件抓住&#xff0c;里面的cookie、用戶名、密碼什么的&#xff0c;它會看得一清二楚&#xff0c;所以&#xff0c;只…

云服務器CVM標準型S5實例性能測評——2025騰訊云

騰訊云服務器CVM標準型S5實例具有穩定的計算性能&#xff0c;CPU采用采用 Intel Xeon Cascade Lake 或者 Intel Xeon Cooper Lake 處理器&#xff0c;主頻2.5GHz&#xff0c;睿頻3.1GHz&#xff0c;CPU內存配置2核2G、2核4G、4核8G、8核16G等配置&#xff0c;公網帶寬可選1M、3…

什么是智算中心

智算中心是一種專門為智能計算提供強大算力支持的基礎設施&#xff0c;以下是關于它的詳細介紹&#xff1a; 定義與功能 智算中心是基于強大的計算能力&#xff0c;特別是針對人工智能算法進行優化的計算中心。它集成了大量的高性能計算設備&#xff0c;如 GPU 集群、FPGA 陣…