Linux 動、靜態庫的實現

前言:當我們寫了一段代碼實現了一個方法,如果我們不想把方法的實現過程暴露給別人看,可以把代碼打包成一個庫,其中形成后綴為.a的是靜態庫,后綴為.so的為動態庫;當別人想使用你的方法時,把打包好的庫跟頭文件一起扔給他就行。

一、靜態庫
1.1生成一個簡單的靜態庫

①首先創建兩個文件,一個.c方法的實現,一個.h方法的聲明;

②簡單實現一下

//mymath.h文件 
#pragma once int add(int x,int y);int sub(int x,int y);      
//mymath.c文件1 #include "mymath.h"  2 int add(int x,int y)  3 {  4   return x+y;  5 }  6 int sub(int x,int y)  7 {  8   return x-y;  9 }  

③makefile怎么寫?

首先要把所有.c文件生成.o文件,然后把.o文件打包生成庫(如果是靜態庫就是.a;如果是動態庫就是.o)

//makefile文件1 lib=libmymath.a  2 $(lib):mymath.o                       3   ar -rc $@ $^ ## ar :生成靜態庫命令;  rc:把所有.o文件打包生成.a文件,如果.a里面已存在則覆蓋;  $@ :依賴目標 $^:依賴文件;4 mymath.o:mymath.c5   gcc -c mymath.c  ##-c 默認生成.o文件6 .PHONY:clean    ##清理7 clean:8   rm -rf *.o *.a mylib 10 .PHONY:output      ##庫發布                                                                                                                      11 output:                                      12   mkdir -p mylib/lib  #創建一串路徑        13   mkdir -p mylib/include 14   cp *.h mylib/include  #把頭文件拷貝到include15   cp *.a mylib/lib    #把.a 庫文件拷貝到lib
~

④make一下

當前目錄下已寫好.c .h和makefile文件:

make后可以看到生成了mymath的.o文件,然后由.o文件生成靜態庫 libmymath.a:

⑤發布一下

查看一下當前目錄:

可以看到生成的mylib文件就是我們制作的庫文件,查看里面的內容:

可以看到其中include文件中包含了方法的頭文件,lib文件中包含的就是靜態庫文件!

既然生成好了就來使用以下吧!

1.2 靜態庫的使用

①創建一個test文件然后把mylib文件拿過來用

②創建一個.c文件里面包含main函數來使用這個庫

//main.c文件
1 #include "mymath.h"
2 int main()
3 {
4   printf("1+1= %d\n",add(1,1));                                                                                                                     
5   return 0;
6 }~

③靜態庫的編譯鏈接

注意:庫的編譯鏈接:gcc + 帶main函數的.c文件 + -I + 頭文件所在的目錄 +?-L?+?庫所在的目錄?+?-l跟庫真實的名字(去掉前綴去掉后綴)

編譯后查看當前目錄:

運行:

這樣就成功的完成了靜態庫的制作到使用!接下來我們來實現下動態庫吧!

二、動態庫

2.1 生成一個簡單的動態庫

我們回到lesson16,然后makeclean,然后再創建兩個.c文件分別存放兩個方法,和其對應的.h方法使用聲明(這兩個方法用來生成動態庫)

隨便實現一下這兩個方法(主要為了展示動態庫的生成和使用):

//mylog.h文件1 #pragma once 2 void log(char* message);  
//mylog.c文件1 #include "mylog.h"2 void log(char* message)3 {4   printf("%s\n",message);                                                                                                                      5 }
//myprint.h文件1 #pragma once 2 void print();   
//myprint.c文件1 #include "myprint.h"2 void print()3 {4   printf("hello linux!!!\n");                                                                                                                    5 }                                                         
2.2 makefile怎么寫

首先makefile 一次生成兩個庫,一個靜態庫、一個動態庫,生成之后發布為mylib(動、靜態庫、頭文件都在里面):

//makefile文件1 static_lib=libmymath.a ##靜態庫2 dynamic_lib=libmymethod.so  ##靜態庫3 .PHONY:all4 all:$(static_lib) $(dynamic_lib)5 $(static_lib):mymath.o6   ar -rc $@ $^ ## ar :生成靜態庫命令;  rc:把所有.o文件打包生成.a文件,如果.a里面已存在則覆蓋;  $@ :依賴目標 $^:依賴文件;7 mymath.o:mymath.c8   gcc -c mymath.c  ##-c 默認生成.o文件9 10 $(dynamic_lib):myprint.o mylog.o11   gcc -shared -o $@ $^   ##shared: 生成動態庫12 myprint.o:myprint.c13   gcc -fPIC -c $^  ##fpic  :產生位置無關碼14 mylog.o:mylog.c15   gcc -fPIC -c $^16 .PHONY:clean    ##清理17 clean:18   rm -rf *.o *.a mylib *.so 19 .PHONY:output      ##庫發布20 output:                                                                                                                                          21   mkdir -p mylib/lib  #創建一串路徑22   mkdir -p mylib/include 23   cp *.h mylib/include  #把頭文件拷貝到include24   cp *.a mylib/lib    #把.a 庫文件拷貝到lib25   cp *.so mylib/lib 

make一下:

mymath生成的靜態庫libmumatg.a ; mylog和myprint生成的libmymethod.so動態庫;

發布一下:

拿到test文件夾里用一下:

2.3 動態庫的使用

創建一個main函數調用它:

//main.c文件
1 #include "mylog.h"
2 #include "myprint.h"
3 #include "mymath.h"
4 #include <stdio.h>
5 int main()
6 {
7   printf("1-1=%d\n",sub(1,1));
8   log("hello linux!!!\n");
9   print();
10   print();                                                                                                                                     
11   return 0;
12 }

編譯鏈接:

運行:

報錯因為加載的時候找不到動態庫,解決方法:

①、把庫拷貝到系統默認的路徑下 /lib64/usr/lib64/

②、在系統文件下創建軟連接? /lib64/usr/lib64/

③、LD-LIBRARY_PATH 導入環境變量

④、進入/etc/ld.so.conf.d創建.conf文件并把庫路徑加進去,然后重新加載 ldconfig

這里我隨便用一個,導入環境變量的方法:

導入前:

導入后:

再運行:

動態庫使用成功!!

三、動態庫如何實現?

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

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

相關文章

ubuntu--字體設置

樣式和字體大小 在終端右鍵-->選擇"Preferences"-->勾選"Custom font": 選擇自己喜歡的樣式&#xff0c;然后通過size滑動條調整字體大小&#xff0c;選擇即可&#xff1a;

Qt核心知識總結

Qt核心知識總結 Qt 是一個功能強大、跨平臺的 C 應用程序開發框架&#xff0c;廣泛應用于圖形用戶界面&#xff08;GUI&#xff09;應用程序的開發&#xff0c;同時也支持非 GUI 應用程序的開發。本文將從入門到精通的角度&#xff0c;詳細解析 Qt 的核心知識點&#xff0c;幫…

Linux 進程概念補充 (自用)

進程概念 內核進程進程狀態內存泄漏進程調度。Linux真實調度算法環境變量 內核 狹義上的操作系統指的是 內核就是進程管理進程調度&#xff0c;文件系統等等。 廣義上的操作系統其實在外殼指令這些。封裝了系統調用的東西。 進程 課本概念程序的一個基本實例 內核觀點&#…

【dify實戰】agent結合deepseek實現基于自然語言的數據庫問答、Echarts可視化展示、Excel報表下載

使用dify agent實現數據庫智能問答&#xff0c;echarts可視化展示&#xff0c;excel報表下載 觀看視頻&#xff0c;您將學會 在dify下如何快速的構建一個agent&#xff0c;來完成數據分析工作&#xff1b;如何在AI的回復中展示可視化的圖表&#xff1b;如何在AI 的回復中加入E…

macos下 ~/.zshrc~ 和 ~/.zshrc

macos下 ~/.zshrc~ 和 ~/.zshrc ~/.zshrc通常是備份文件或臨時文件&#xff0c;可能由編輯器&#xff08;如vim&#xff09;創建&#xff0c;通常可以安全刪除&#xff0c;不會影響系統運行。 在Mac下&#xff0c;這種帶~后綴的備份文件通常是由以下情況產生&#xff1a; 常…

位運算---總結

位運算 基礎 1. & 運算符 : 有 0 就是 0 2. | 運算符 : 有 1 就是 1 3. ^ 運算符 : 相同為0 相異為1 and 無進位相加位運算的優選級 不用在意優先級,能加括號就加括號給一個數 n ,確定它的二進制位中第 x 位是 0 還是 1? 規定: 題中所說的第x位指:int 在32位機器下4個…

Java SpringBoot的自定義配置

一&#xff0c;一個類多個屬性的情況 application.properties配置文件寫法 my.config.ip127.0.0.1 my.config.port8080自定義配置類&#xff1a;MyTestConfig import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties…

Matlab FCM模糊聚類

1、內容簡介 Matlab 211-FCM模糊聚類 可以交流、咨詢、答疑 2、內容說明 略 3、仿真分析 略 4、參考論文 略

C++項目 —— 基于多設計模式下的同步異步日志系統(4)(雙緩沖區異步任務處理器(AsyncLooper)設計)

C項目 —— 基于多設計模式下的同步&異步日志系統&#xff08;4&#xff09;&#xff08;雙緩沖區異步任務處理器&#xff08;AsyncLooper&#xff09;設計&#xff09; 異步線程什么是異步線程&#xff1f;C 異步線程簡單例子代碼解釋程序輸出關鍵點總結擴展&#xff1a;使…

C# 使用 BinaryFormatter 和相關類型時的反序列化風險

C# 使用 BinaryFormatter 和相關類型時的反序列化風險 由來&#xff1a;在項目使用.NET Reactor 混淆 C# 的序列化和反序列化發現存在的問題&#xff0c;讀取文件時&#xff0c;轉化為對應的類數據有時候為空&#xff0c;所以就在網上搜索了相關知識&#xff0c;在此做個筆記以…

OpenCv高階(四)——角點檢測

一、角點檢測 在計算機視覺中&#xff0c;角點檢測是識別圖像中局部區域&#xff08;角點&#xff09;的關鍵技術&#xff0c;這些區域通常是兩條或多條邊緣的交點&#xff0c;具有豐富的結構信息&#xff0c;常用于圖像匹配、跟蹤、三維重建等任務。 Harris角點檢測算法是一…

Conda 入門指令教程

Conda 入門指令教程 Conda 是一個強大的包和環境管理工具&#xff0c;廣泛應用于數據科學和機器學習項目中。本文將介紹 Conda 的常用指令&#xff0c;幫助你快速上手。 1. Conda 基礎操作 查看 Conda 版本 conda --version顯示當前安裝的 Conda 版本。 更新 Conda conda…

Unity ShaderLab引用HLSL文件找不到其中函數

在寫Unity Shader的過程中&#xff0c;常常需要將方法封裝到HLSL文件中&#xff0c;今天遇到一個這樣的報錯&#xff0c; 明明hlsl文件路徑引用沒問題&#xff0c;卻引用不到方法 并且將分散文件中的函數復制過來一切正常&#xff0c;最終定位到HLSL的預編譯指令中 這指令的…

uniapp上傳圖片時(可選微信頭像、相冊、拍照)

參考文獻&#xff1a;微信小程序登錄——頭像_onchooseavatar-CSDN博客 <button open-type"chooseAvatar" chooseavatar"onChooseAvatar"> </button>onChooseAvatar(e) {uni.showLoading({title: 上傳中...,mask: true});uni.uploadFile({url…

單元測試的一般步驟

Qt Test Qt Test 是 Qt 開發人員發布的一個單元測試框架&#xff0c;用于測試基于 Qt 框架的應用程序或庫。它提供了單元測試框架中常見的所有功能以及用于測試圖形用戶界面的擴展。 1.自動化測試包絡ui測試>接口測試>單元測試&#xff1b;現問如何使用Qt進行單元測試&…

【Matlab】中國沿岸潮灘寬度和坡度分布

【Matlab】中國沿岸潮灘寬度和坡度分布 參考文獻見最后或者閱讀原文&#xff01; 中國沿岸潮灘寬度和坡度分布: figure 1 a 潮灘寬度分布。b 潮灘坡度分布。 圖中標注了中國沿海各省&#xff0c;分別為遼寧&#xff08;LN&#xff09;、河北&#xff08;HB&#xff09;、山東&…

理解.NET Core中的配置Configuration

什么是配置 .NET中的配置&#xff0c;本質上就是key-value鍵值對&#xff0c;并且key和value都是字符串類型。 在.NET中提供了多種配置提供程序來對不同的配置進行讀取、寫入、重載等操作&#xff0c;這里我們以為.NET 的源碼項目為例&#xff0c;來看下.NET中的配置主要是有…

windows服務器及網絡:論如何安裝(虛擬機)

今天我要介紹的是&#xff1a;在Windows中對于安裝系統&#xff08;虛擬機的步驟以及相關的安裝事宜&#xff09;&#xff0c;事不宜遲&#xff0c;讓我們來看看系統安裝&#xff08;虛擬機&#xff09;是怎么操作的&#xff1a; 對現在來說&#xff0c;安裝電腦系統已經是非常…

shardingsphere-jdbc集成Seata分布式事務

1、導入相關依賴 <!-- shardingsphere-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.1</version></dependency><!-- shardingspher…

05-DevOps-Jenkins自動拉取構建代碼

新建Gitlab倉庫 先在Gitab上創建一個代碼倉庫&#xff0c;選擇創建空白項目 安裝說明進行填寫&#xff0c;然后點擊創建項目 創建好的倉庫是空的&#xff0c;什么都沒有 新建一個springboot項目&#xff0c;用于代碼上傳使用。 只是為了測試代碼上傳功能&#xff0c;所以代碼…