大話C語言:第26篇 靜態庫

1 靜態庫概述

C語言靜態庫(Static Library)是一種包含一組目標文件的歸檔文件,這些目標文件通常是由多個C語言源文件編譯而成的。靜態庫在程序編譯時被鏈接到目標程序中,成為程序的一部分,因此在運行時不再需要額外的庫文件。與動態庫(Dynamic Library)不同,靜態庫在編譯時就已經被完全嵌入到可執行文件中,因此生成的可執行文件通常較大,但無需在運行時依賴外部庫文件。

靜態庫通常具有.a的文件擴展名(代表archive),而在Windows中則通常使用.lib擴展名。創建靜態庫的過程涉及將多個目標文件(通常由.o.obj文件組成)打包成一個單獨的庫文件。

使用靜態庫的好處之一是,它使得程序在分發時更加簡單,因為所有必要的代碼都已經包含在可執行文件中。此外,由于靜態鏈接在編譯時就已經完成,因此可以避免運行時動態鏈接可能帶來的版本兼容性問題。然而,靜態庫也有一些缺點,比如生成的可執行文件較大,以及如果多個程序使用相同的靜態庫,那么每個程序都會包含庫的一份完整副本,導致磁盤空間的浪費。

2 靜態庫制作

例如,實現一個簡單的數學運算MathFun.c

// 靜態庫中的函數,用于加法  
int add(int a, int b) 
{  return a + b;  
}  // 靜態庫中的函數,用于減法  
int subtract(int a, int b) 
{  return a - b;  
}
  • 通過gcc -c編譯源代碼,生成目標文件.o

  • 通過ar rc(或rcs)將目標文件.o打包生成靜態庫.a文件

gcc -c MathFun.c -o MathFun.o   
ar rc libMathFun.a MathFun.o

注意,庫文件需要以lib開頭,例如上述數學庫,libMathFun.a;如果不帶lib的話,將庫文件鏈接至可執行文件時,可能會引起編譯錯誤,如下:

# mathfunc.a放在dynamicdemo/lib目錄下
whccf@whccf-VirtualBox:~/code/staticdemo$ gcc -o calculator calculator.c -L /home/whccf/code/staticdemo/lib -lmathfunc
/usr/bin/ld: 找不到 -lmathfunc
collect2: error: ld returned 1 exit status# 解決方案
# 將dynamicdemo/lib下的mathfunc.a重新命名為libmathfunc.a,然后,再次使用gcc命令重新編譯即可。

3 靜態庫使用

主程序calculator.c,它使用靜態庫中的函數

#include <stdio.h>  
#include "MathFun.h"  int main()
{  int a = 5;  int b = 3;  int sum = add(a, b);  int diff = subtract(a, b);  printf("Sum: %d\n", sum);  printf("Difference: %d\n", diff);  return 0;  
}

為了編譯這個程序并鏈接靜態庫,需要使用以下命令:

gcc -o calculator calculator.c -L /home/whccf/code/staticdemo/lib/ -lMathFun

其中,

  • -L.告訴編譯器在當前目錄下查找庫文件

  • -lMathFun則告訴編譯器鏈接名為libMathFun.a的庫,注意不需要提供.a后綴

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

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

相關文章

java Lambda表達式介紹

Lambda 表達式是 Java 8 中引入的一種語法糖,用于簡化使用函數式接口的代碼編寫。它使得 Java 編程更加簡潔和靈活,特別是在處理集合數據、事件監聽器等方面提供了便利。 Lambda 表達式的語法 Lambda 表達式的基本語法如下: (parameters) -> expression或者是一個代碼…

盤古5.0,靠什么去解最難的題?

文&#xff5c;周效敬 編&#xff5c;王一粟 當大模型的競爭開始拼落地&#xff0c;商業化在B端和C端都展開了自由生長。 在B端&#xff0c;借助云計算向千行萬業扎根&#xff1b;在C端&#xff0c;通過軟件App和智能終端快速迭代。 在華為&#xff0c;這家曾經以通信行業起…

Error: A JNl error has occurred, please check your installation and try again.

Eclipse 運行main方法的時候報錯&#xff1a;Error: A JNl error has occurred, please check your installation and try again. 一、問題分析 導致這個問題&#xff0c;主要原因&#xff0c;我認為是在新版本中&#xff0c;默認的JDK編譯版本與我們配置的JDK版本不一致導致的…

公網環境使用Potplayer遠程訪問家中群暉NAS搭建的WebDAV聽歌看電影

文章目錄 前言1 使用環境要求&#xff1a;2 配置webdav3 測試局域網使用potplayer訪問webdav4 內網穿透&#xff0c;映射至公網5 使用固定地址在potplayer訪問webdav 前言 本文主要介紹如何在Windows設備使用potplayer播放器遠程訪問本地局域網的群暉NAS中的影視資源&#xff…

告別流失,擁抱增長!Xinstall智能邀請系統,讓你的App拉新更高效

在移動互聯網時代&#xff0c;App的推廣和運營面臨著諸多挑戰。其中&#xff0c;如何有效地進行邀請拉新活動&#xff0c;吸引更多新用戶&#xff0c;成為了每個運營者都需要面對的問題。今天&#xff0c;我們將為大家介紹一款能夠幫助你輕松解決這一難題的神器——Xinstall。 …

C語言從頭學28——數組(一)

一、基本概念 數組是一組相同類型的值被順序地儲存在一起。數組表示方法為變量名加方括號&#xff0c;方括號里是數組的成員數量。例如&#xff1a; int arr[20]; //聲明了一個 int 類型的名為 arr 包含20個成員的數組 數組的成員是從0開始編號的&#x…

深入理解Symfony框架的環境配置策略

引言 Symfony是一個高度靈活的PHP框架&#xff0c;它允許開發者通過配置文件來定制應用程序的行為&#xff0c;以適應不同的運行環境。環境配置是Symfony中一個重要的概念&#xff0c;它允許開發者為開發、測試和生產環境設置不同的配置參數。本文將詳細探討Symfony的環境配置…

7-491 3名同學5門課程成績,輸出最好成績及所在的行和列(二維數組作為函數的參數)

編程:數組存儲3名同學5門課程成績 輸出最好成績及所在的行和列 要求&#xff1a;將輸入、查找和打印的功能編寫成函數 并將二維數組通過指針參數傳遞的方式由主函數傳遞到子函數中 輸入格式: 每行輸入一個同學的5門課的成績&#xff0c;每個成績之間空一格&#xff0c;見輸入…

互聯網框架五層模型詳解

注&#xff1a;機翻&#xff0c;未校對。 What is the Five Layers Model? The Framework of the Internet Explained 五層模型互聯網框架解釋 Computer Networks are a beautiful, amazing topic. Networks involve so much knowledge from different fields, from physics…

Elasticsearch架構基本原理

Elasticsearch的架構原理可以詳細分為以下幾個方面進行介紹&#xff1a; 一、Elasticsearch基本概念 Elasticsearch&#xff08;簡稱ES&#xff09;是一個基于Lucene構建的開源、分布式、RESTful搜索和分析引擎。它支持全文搜索、結構化搜索、半結構化搜索、數據分析、地理位…

[數據集][目標檢測]城市街道井蓋破損未蓋丟失檢測數據集VOC+YOLO格式4404張5類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;4404 標注數量(xml文件個數)&#xff1a;4404 標注數量(txt文件個數)&#xff1a;4404 標注…

note-網絡是怎樣連接的6 請求到達服務器,響應返回瀏覽器

助記提要 服務器程序的結構套接字的指代方式MAC模塊的接收過程IP模塊的接收過程TCP模塊處理連接包TCP模塊處理數據包TCP模塊的斷開操作URI轉換為實際文件路徑URI調用程序Web服務器訪問控制響應內容的類型 6章 請求到達服務器&#xff0c;響應返回瀏覽器 1 服務器概覽 在數據…

昇思25天學習打卡營第03天 | 張量 Tensor

昇思25天學習打卡營第03天 | 張量 Tensor 文章目錄 昇思25天學習打卡營第03天 | 張量 Tensor張量張量的創建張量的屬性Tensor與NumPy轉換稀疏張量CSRTensorCOOTensor 總結打卡 張量 張量&#xff08;Tensor&#xff09;是一種類似于數組和矩陣的特殊數據結構&#xff0c;是神經…

MATLAB|更改繪圖窗口的大小和位置

MATLAB繪圖 plot、plot3、cdfplot都適用 效果 如下圖&#xff0c;運行程序后可以直接得到這兩個繪圖窗口。 右上角的Figure1是原始圖片&#xff0c;右下角的Figure2是調整了位置和大小后的繪圖窗口。 完整源代碼 % 繪圖大小和位置調整 % Evand©2024 % 2024-7-1/Ver1…

Transformer模型原理細節解析

基本原理: Transformer 的核心概念是 自注意力機制(Self-Attention Mechanism),它允許模型在處理每個輸入時“關注”輸入序列的不同部分。這種機制讓模型能夠理解每個單詞或符號與其他單詞或符號之間的關系,而不是逐個地線性處理輸入。 Transformer 主要由兩個部分組成:…

手把手教你搭建PyTorch環境:MindStudio中PyTorch模型開發實戰

本次實驗的視頻鏈接如下&#xff1a;?https://www.bilibili.com/video/BV1iA4y1f7o1/ 本次實驗在MindStudio上進行&#xff0c;請先按照 教程 配置環境,安裝MindStudio。 ? MindStudio的是一套基于華為自研昇騰AI處理器開發的AI全棧開發工具平臺&#xff0c;該IDE上功能很多…

Boost 智能指針

scoped_ptr 不能被復制或賦值給其他 scoped_ptr 對象,不能與其他指針比較 (除了 nullptr) scoped_ptr 用例 template <typename T> class scoped_ptr {public:// 構造函數:初始化 scoped_ptr 并接管指針的所有權explicit scoped_ptr(T* ptr = nullptr) : ptr_(ptr) …

Flink CDC的使用

MySQL數據準備 create database if not exists test; use test; drop table if exists stu; create table stu (id int primary key auto_increment, name varchar(100), age int); insert into stu(name, age) values("張三",18); insert into stu(name, age) valu…

ESOP 系統助力電子設備公司的管理模式升級

在科技飛速發展的時代&#xff0c;電子設備行業競爭愈發激烈&#xff0c;企業要想在市場中立足并持續發展&#xff0c;不斷升級管理模式成為關鍵。ESOP系統的引入&#xff0c;為電子設備公司帶來了全新的機遇&#xff0c;有力地推動了管理模式的升級。 ESOP 系統首先為電子設備…

element el-table表格切換分頁保留分頁數據+限制多選數量

el-table表格并沒有相關的方法來禁用表頭里面的多選按鈕 那么我們可以另辟蹊徑&#xff0c;來實現相同的多選切換分頁&#xff08;保留分頁數據&#xff09; 限制多選數量的效果 <el-table:data"tableData"style"width: 100%">// 不使用el-talbe自帶…