【Linux】靜態庫的制作和使用詳解

在這里插入圖片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃個人主頁 :阿然成長日記 👈點擊可跳轉
📆 個人專欄: 🔹數據結構與算法🔹C語言進階🔹C++🔹Liunx
🚩 不能則學,不知則問,恥于問人,決無長進
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目錄

  • 一、庫的基礎知識
  • 二、如何編寫靜態庫
    • 1.原理簡述
    • 2.實際操作
    • 使用makefile文件自動化構建
  • 靜態庫的使用

前言:

本篇博客講解兩個類型的庫:動態庫(.so) 和 靜態庫(.a).的制作。

一、庫的基礎知識

庫的作用:提升開發效率。隱藏源代碼

庫的本質:將所有的[.o]結尾的可執行目標二進制文件打包形成一個文件夾。

二、如何編寫靜態庫

1.原理簡述

你編寫了好幾個文件,給別人使用,但是又不想讓使用者看到內部源代碼,此時有沒有什么辦法呢。

本質就是隱藏.c源文件。

  • 第一步:將所有.c的文件形成.o文件

  • 第二步:將所有的.o使用ar指令打包成一個庫文件。

  • 具體流程如下圖:

在這里插入圖片描述

這樣做的好出有:
(1)將所有的源文件打包好,防止使用者再拷貝時丟失原文件。提高了使用效率。
(2)使用者無法查看源碼,提高了安全性

2.實際操作

分別創建了4個文件:mymath.h mymath.c myprint.h myprint.c.

  • 1.<mymath.h>:
#pragma once    
#include<stdio.h>    extern int addToTarget(int start, int end);//聲明函數
  • 2.mymath.c
  #include "mymath.h"                                             #             //這段函數的作用是計算start-end之間的和int addToTarget(int start, int end)                               {                                                                int sum = 0;                                                   int i = start;                                                 for(i; i <= end; i++){                                                                                                                                 sum += i;                                                    }                                                              return sum;                                                    }  
  • 3.myprint.h
#pragma once     #include<stdio.h>    
#include<time.h>    extern void Print(const char* str);  
  • 4.myprint.c
#include "myprint.h"                                                            //這段函數功能是輸出傳入的字符串,后面加上時間戳                                                                    
void Print(const char* str)                                                          
{printf("%s[%d]\n",str,(int)(time(NULL)));
}       

有了上面四個文件后,還需要寫一個main方法使用這些函數。

#include "myprint.h"    
#include "mymath.h"    int main()    
{    Print("hello,world");                                                                                                               int res = addToTarget(1,100);    printf("res: %d\n",res);    return 0;    
}    

開始制作靜態庫:
第一步:將所有的.c文件–>.o文件
使用gcc的【-c】選項,代碼如下:

gcc -o myprint.o -c myprint.c
gcc -o mymath.o -c mymath.c

注意:main函數不用參與,每個使用者都會有自己的main方法去調用庫文件。

第二步:o文件打包成名字叫hello的靜態庫
知識補充:

【ar】指令:
ar -[選項] + lib+庫文件名.a + 所有.o文件
選項這里只說r(replace替換),c(create創建)就可以了,就足以讓我們創建靜態庫了.
注意: 格式一定是lib+庫文件名.a。也就是說要形成的靜態庫的名字 前綴必須是lib,后綴必須是.a,中間可以隨便起名字.

執行代碼:

ar -rc libhello.a main.o myprint.o mymath.o

在這里插入圖片描述

可以發現,此時目錄下面就會存在剛打包好的庫文件了,但是,還需要結合對應的頭文件才能正確的使用庫文件中的函數。往下學!

使用makefile文件自動化構建

理清楚一個文件形成靜態庫的過程后 總結來說: .c文件 —> .o文件 —>
打包形成靜態庫

既然是這么一套固定的流程,那么我們完全可以用Makefile來完成這些工作。需要注意的是搞清各個文件的依賴關系,然后再進行編寫。

所以最后的Makefile編寫如下:

libhello.a: mymath.o myprint.o                                                                                                        ar -rc libhello.a mymath.o myprint.o    
mymath.o : mymath.c    gcc -o mymath.o -c mymath.c    
myprint.o: myprint.c    gcc -o myprint.o -c myprint.c    .PHONY:clean    
clean:    rm -rf *.o libhello.a    

在這里插入圖片描述

這樣還沒有結束:還有對應的許多頭文件呢。一般都是.h聲明,然后從.o打包形成的庫里面找。

  • 所以我們還需要做一件工作:將.h和.a文件規整到一起.在Makefile加入以內容:就是將頭文件和庫文件規整在一起,邏輯如下 在這里插入圖片描述

  • 在這里插入圖片描述

  • makefile代碼如下

.PHONY:hello    
hello:    mkdir -p hello/lib    mkdir -p hello/include    cp -rf *.h hello/include    cp -rf *.a hello/lib  
  • 總結來說: .c文件 —> .o文件 —> 打包形成靜態庫–>最后將.h和.a文件規整到一起

這樣就制作好了一個靜態庫!如何去使用呢?

靜態庫的使用

方法一:直接拷貝到系統路徑

頭文件gcc系統默認搜索路徑是:/usr/include
庫文件gcc系統默認搜索路徑是:/lib64 或者 /usr/lib64

  • 可以將你編寫的靜態庫拷貝進/usr/lib64。頭文件拷貝進/usr/include ;但是這樣做會污染原來別人已經寫好的庫。不建議使用

方法二:指定路徑搜索

我們可以直接在編譯的時候加上頭文件和庫文件的路徑.
對于上面的代碼我們執行:

gcc main.c -I ./hello/include/ -L ./hello/lib/ -lhello

就可以指定路徑進行查找。

選項:-I(i的大寫)表示頭文件的搜索路徑
-L表示庫文件的搜索路徑
-l(小寫的L)表示在特定路徑下,要使用哪一個庫.

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

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

相關文章

代碼隨想錄算法訓練營第71天:路徑算法[1]

代碼隨想錄算法訓練營第71天&#xff1a;路徑算法 ? bellman_ford之單源有限最短路 卡碼網&#xff1a;96. 城市間貨物運輸 III(opens new window) 【題目描述】 某國為促進城市間經濟交流&#xff0c;決定對貨物運輸提供補貼。共有 n 個編號為 1 到 n 的城市&#xff0c…

【CT】LeetCode手撕—4. 尋找兩個正序數組的中位數

目錄 題目1- 思路2- 實現?4. 尋找兩個正序數組的中位數——題解思路 3- ACM 實現 題目 原題連接&#xff1a;4. 尋找兩個正序數組的中位數 1- 思路 思路 將尋找中位數 ——> 尋找兩個合并數組的第 K 大 &#xff08;K代表中位數&#xff09; 實現 ① 遍歷兩個數組 &am…

企業級監控系統Zabbix

文章目錄 Zabbix介紹Zabbix架構Zabbix serverZabbix agentZabbix proxy Zabbix Server的安裝Zabbix Agent的安裝監控主機流程zabbix_get自定義模板和監控項實戰用戶登錄數監控1.指定監控項命令2.重啟Agent服務3.在Server上創建監控項4.測試監控項5.查看監控項圖形 觸發器定義觸…

外泌體相關基因肝癌臨床模型預測——2-3分純生信文章復現——4.預后相關外泌體基因確定單因素cox回歸(2)

內容如下&#xff1a; 1.外泌體和肝癌TCGA數據下載 2.數據格式整理 3.差異表達基因篩選 4.預后相關外泌體基因確定 5.拷貝數變異及突變圖譜 6.外泌體基因功能注釋 7.LASSO回歸篩選外泌體預后模型 8.預后模型驗證 9.預后模型魯棒性分析 10.獨立預后因素分析及與臨床的…

【若依】關閉當前標簽頁并跳轉路由到其他頁面

使用場景如&#xff1a;當在新增/編輯路由頁面提交成功后&#xff0c;需要關閉當前頁&#xff0c;并跳轉回列表頁。 實現代碼&#xff1a; this.$store.dispatch("tagsView/delView", this.$route); //關閉當前頁 this.$router.replace({ path: "/xxx/xxx"…

【經驗總結】Springboot打印指定類的日志到指定文件中

原文地址&#xff1a;https://www.cnblogs.com/zeng1994/p/f9bff238b13a0bf8fb8bf88c41db7a34.html 以下內容已經過實踐&#xff0c;勘誤&#xff0c;總結 環境&#xff1a;Springboot2.5.2 公司有個項目&#xff0c;需要和幾個第三方系統對接。這種項目&#xff0c;日志一定要…

香橙派 AIpro 根據心情生成專屬音樂

香橙派 AIpro 根據心情生成專屬音樂 一、OrangePi AI pro 開發版參數介紹1.1 接口簡介1.2 OrangePi AI pro 的Linux系統功能適配情況1.3 開發板開機1.4 遠程連接到 OrangePi AIpro 二、開發環境搭建2.1 創建環境、代碼部署文件夾2.2 安裝 miniconda2.3 為 miniconda 更新國內源…

生態系統NPP及碳源、碳匯模擬技術教程

原文鏈接&#xff1a;生態系統NPP及碳源、碳匯模擬技術教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608293&idx3&sn2604c5c4e061b4f15bb8aa81cf6dadd1&chksmfa826602cdf5ef145c4d170bed2e803cd71266626d6a6818c167e8af0da93557c1288da21a71&a…

【綜合能源】計及碳捕集電廠低碳特性及需求響應的綜合能源系統多時間尺度調度模型

目錄 1 主要內容 2 部分程序 3 實現效果 4 下載鏈接 1 主要內容 本程序是對《計及碳捕集電廠低碳特性的含風電電力系統源-荷多時間尺度調度方法》方法復現&#xff0c;非完全復現&#xff0c;只做了日前日內部分&#xff0c;并在上述基礎上改進升級為電熱綜合電源微網系統&…

vue+openlayers之幾何圖形交互繪制基礎與實踐

文章目錄 1.實現效果2.實現步驟3.示例頁面代碼3.基本幾何圖形繪制的關鍵代碼 1.實現效果 繪制點、線、多邊形、圓、正方形、長方形 2.實現步驟 引用openlayers開發庫。加載天地圖wmts瓦片地圖。在頁面上添加幾何圖形繪制的功能按鈕&#xff0c;使用下拉列表&#xff08;sel…

程序員績效管理-進一步思考

工時管理也好、項目管理&#xff08;軟件項目&#xff09;也好&#xff0c;市面上已經很多了&#xff0c;你做這個和他們區別何在&#xff1f;大的公司一般都自己做&#xff0c;誰又為你買單&#xff1f;根據目前的反饋&#xff0c;主要的疑問就是這兩個問題。 進一步思考如下&…

基于JavaScript、puppeteer的爬蟲

前期準備: npm puppeteer import puppeteer from puppeteer; puppeteer文檔 第一步&#xff1a;啟動瀏覽器&#xff0c;跳轉到需要爬取的頁面 const browser await puppeteer.launch({ headless: false });const page await browser.newPage();await page.goto(url, { w…

【目標檢測實驗系列】YOLOv5模型改進:引入輕量化多維動態卷積ODConv,減少計算量的同時保持精度穩定或略微上漲!(內含源代碼,超詳細改進代碼流程)

1. 文章主要內容 本篇博客主要涉及輕量化多維動態卷積ODConv&#xff0c;融合到YOLOv5模型中&#xff0c;減少計算量的同時保持精度穩定或略微上漲。&#xff08;通讀本篇博客需要7分鐘左右的時間&#xff09;。 2. 介紹 ODconv沿著空間、輸入通道、輸出通道以及卷積核空間的核…

領導被我的花式console.log吸引了!直接寫入公司公共庫!

背景簡介 這幾天代碼評審,領導無意中看到了我本地代碼的控制臺,被我花里胡哨的console打印內容吸引了! 老板看見后,說我這東西有意思,花里胡哨的,他喜歡! 但是隨即又問我,這么花里胡哨的東西,上生產會影響性能吧?我自信的說:不會,代碼內有判斷的,只有開發環境會…

后端工作之一:CrapApi —— API接口管理系統部署

一個API接口的網絡請求都有這些基本元素構成&#xff1a; API接口大多數是由后端編寫&#xff0c;前端開發人員進行請求調用 就是一個網絡請求的流程。 API&#xff08;Application Programming Interface&#xff09;接口是現代軟件開發中不可或缺的一部分。它們提供了一種…

14270-02G 同軸連接器

型號簡介 14270-02G是Southwest Microwave的2.4 mm 同軸連接器。這款連接器連接器采用不銹鋼、鈹銅合金、黃銅合金和 ULTEM 1000 等高質量材料&#xff0c;可能具有更好的耐腐蝕性、導電性和機械強度。金鍍層可以提供更低的接觸電阻和更好的耐腐蝕性。 型號特點 電纜的中心導體…

過擬合和欠擬合的概念

過擬合和欠擬合的概念 過擬合&#xff08;Overfitting&#xff09;是指機器學習模型在訓練數據上表現得非常好&#xff0c;但在新數據&#xff08;測試集或實際應用中的數據&#xff09;上卻表現不佳的現象。這種情況通常發生在模型復雜度過高&#xff0c;導致它過度適應了訓練…

健康課程知識培訓小程序網站如何學員教務管理

醫學專業學生或是從業醫生、護士等都需要不斷學習鞏固自己的技術和拓寬知識面&#xff0c;除了主要學習來源外&#xff0c;培訓機構課程需求也是提升自身實力的方法&#xff0c;市場中也存在不少醫藥健康內容培訓機構或是醫院內部員工培訓等。 運用雨科平臺搭建醫藥健康內容培…

前端八股文 說一下盒模型

網頁中任何一個元素都可以視為一個盒子&#xff0c;由里到外&#xff0c;盒模型包括外邊界&#xff08;margin&#xff09;、邊框&#xff08;border&#xff09;、內邊界&#xff08;padding&#xff09;和內容&#xff08;content&#xff09;。 盒模型基本分為3種&#xff1…

k8s離線安裝安裝skywalking9.4

目錄 概述資源下載Skywalking功能介紹成果速覽實踐rbacoapoap-svcuiui-svc 結束 概述 k8s 離線安裝安裝 skywalking9.4 版本&#xff0c;環境&#xff1a;k8s版本為&#xff1a;1.27.x 、spring boot 2.7.x spring cloud &#xff1a;2021.0.5 、spring.cloud.alibab&#xff1…