最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中三種庫(kù)的編譯和使用方法

 更新時(shí)間:2026年04月13日 08:37:51   作者:Hello小趙  
本文介紹了C語(yǔ)言自定義簡(jiǎn)易math庫(kù)的三種編譯方式:直接編譯、靜態(tài)庫(kù)(.a)和動(dòng)態(tài)庫(kù)(.so),每種方式都有詳細(xì)步驟和代碼示例,適合不同場(chǎng)景下的項(xiàng)目需求,需要的朋友可以參考下

前言

在 C 語(yǔ)言開(kāi)發(fā)中,將通用功能封裝為獨(dú)立庫(kù)是提升代碼復(fù)用性、項(xiàng)目可維護(hù)性的核心手段。本文以自定義簡(jiǎn)易 math 庫(kù)為例,手把手教你實(shí)現(xiàn)直接編譯、靜態(tài)庫(kù)(.a)、動(dòng)態(tài)庫(kù)(.so) 三種編譯調(diào)用方式

一、基礎(chǔ)文件準(zhǔn)備(核心代碼)

我們先創(chuàng)建 3 個(gè)核心文件,實(shí)現(xiàn)add(加法)、sub(減法)兩個(gè)基礎(chǔ)數(shù)學(xué)函數(shù),結(jié)構(gòu)清晰、可直接復(fù)用。

  1. math.h(頭文件:函數(shù)聲明):頭文件用于聲明函數(shù)接口,添加頭文件保護(hù)宏防止重復(fù)包含,這是 C 語(yǔ)言開(kāi)發(fā)的標(biāo)準(zhǔn)規(guī)范。
#ifndef MATH_H
#define MATH_H
// 加法函數(shù)聲明
int add(int a, int b);
// 減法函數(shù)聲明
int sub(int a, int b);
#endif
  1. math.c(源文件:函數(shù)實(shí)現(xiàn)):實(shí)現(xiàn)頭文件中聲明的函數(shù)邏輯,是庫(kù)文件的核心代碼。
#include "math.h"

// 加法實(shí)現(xiàn)
int add(int a, int b) {
    return a + b;
}

// 減法實(shí)現(xiàn)
int sub(int a, int b) {
    return a - b;
}
  1. main.c(主程序:調(diào)用庫(kù)函數(shù)):主程序文件,引入自定義頭文件,調(diào)用 math 庫(kù)中的函數(shù)完成測(cè)試。
#include <stdio.h>
#include "math.h"  // 引入自定義math庫(kù)頭文件

int main() {
    int a = 10, b = 5;
    // 調(diào)用庫(kù)函數(shù)
    printf("%d + %d = %d\n", a, b, add(a, b));
    printf("%d - %d = %d\n", a, b, sub(a, b));
    return 0;
}

二、方式 1:直接編譯(簡(jiǎn)易版,無(wú)獨(dú)立庫(kù))

適合小型項(xiàng)目 / 臨時(shí)測(cè)試,不生成獨(dú)立庫(kù)文件,直接將所有源文件編譯為可執(zhí)行程序,簡(jiǎn)單快捷。

  1. 編譯:將main.c和math.c一起編譯,生成可執(zhí)行文件main
gcc main.c math.c -o main
  1. 運(yùn)行程序
./main

運(yùn)行結(jié)果

三、方式 2:編譯為靜態(tài)庫(kù)(.a)【推薦分發(fā)使用】

靜態(tài)庫(kù)是編譯時(shí)嵌入可執(zhí)行文件的庫(kù)文件(后綴.a),運(yùn)行時(shí)無(wú)外部依賴,適合獨(dú)立分發(fā)工具。
完整步驟

  1. 編譯生成目標(biāo)文件(.o):僅編譯不鏈接,生成中間目標(biāo)文件
gcc -c math.c -o math.o

參數(shù)說(shuō)明:-c 表示只執(zhí)行編譯操作,不進(jìn)行鏈接。

  1. 打包生成靜態(tài)庫(kù)(libmath.a):使用ar命令將目標(biāo)文件打包為靜態(tài)庫(kù),Linux 庫(kù)文件必須以lib開(kāi)頭。
ar rcs libmath.a math.o

參數(shù)說(shuō)明:
r:替換 / 插入文件到庫(kù)中;
c:創(chuàng)建新庫(kù);
s:生成庫(kù)索引,提升鏈接速度。

  1. 編譯主程序,鏈接靜態(tài)庫(kù)
gcc main.c -L. -lmath -o main

參數(shù)說(shuō)明:
-L.:指定庫(kù)文件搜索路徑為當(dāng)前目錄;
-lmath:鏈接名為libmath.a的靜態(tài)庫(kù)(自動(dòng)補(bǔ)全lib前綴和.a后綴)。

  1. 運(yùn)行程序

四、方式 3:編譯為動(dòng)態(tài)庫(kù)(.so)【大型項(xiàng)目首選】

動(dòng)態(tài)庫(kù)(共享庫(kù),后綴.so)是運(yùn)行時(shí)加載的庫(kù),多個(gè)程序可共享使用,節(jié)省內(nèi)存,適合大型項(xiàng)目、系統(tǒng)級(jí)開(kāi)發(fā)。

  1. 編譯生成動(dòng)態(tài)庫(kù)(libmath.so)
gcc -shared -fPIC math.c -o libmath.so

參數(shù)說(shuō)明:
-shared:指定生成動(dòng)態(tài)共享庫(kù);
-fPIC:生成位置無(wú)關(guān)代碼(動(dòng)態(tài)庫(kù)必備參數(shù))。

  1. 編譯主程序,鏈接動(dòng)態(tài)庫(kù):命令與靜態(tài)庫(kù)完全一致,編譯器會(huì)優(yōu)先匹配.so動(dòng)態(tài)庫(kù):
gcc main.c -L. -lmath -o main
  1. 關(guān)鍵:解決動(dòng)態(tài)庫(kù)運(yùn)行依賴——直接運(yùn)行./main會(huì)報(bào)錯(cuò):error while loading shared libraries: libmath.so

原因: 系統(tǒng)默認(rèn)僅搜索/lib//usr/lib等系統(tǒng)目錄,不會(huì)查找當(dāng)前目錄。
解決方案: 將當(dāng)前路徑加入庫(kù)文件路徑中。

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
  1. 運(yùn)行
./main

以上就是C語(yǔ)言中三種庫(kù)的編譯和使用方法的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言庫(kù)的編譯和使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文總結(jié)C++運(yùn)算符的使用方法

    一文總結(jié)C++運(yùn)算符的使用方法

    這篇文章主要為大家詳細(xì)總結(jié)了C++中運(yùn)算符的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • C語(yǔ)言中scanf與scnaf_s函數(shù)詳解

    C語(yǔ)言中scanf與scnaf_s函數(shù)詳解

    大家好,本篇文章主要講的是C語(yǔ)言中scanf與scnaf_s函數(shù)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C++如何實(shí)現(xiàn)簡(jiǎn)易掃雷游戲

    C++如何實(shí)現(xiàn)簡(jiǎn)易掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C++如何實(shí)現(xiàn)簡(jiǎn)易掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++圖像加載之libpng、FreeImage、stb_image詳解

    C++圖像加載之libpng、FreeImage、stb_image詳解

    libpng、FreeImage、stb_image都是圖像解析的開(kāi)源庫(kù),這篇文章主要為大家詳細(xì)介紹了這三者的使用方法,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-06-06
  • MoveWindow() SetWindowPos()的區(qū)別于聯(lián)系

    MoveWindow() SetWindowPos()的區(qū)別于聯(lián)系

    這篇文章主要介紹了VC++中MoveWindow() SetWindowPos()的區(qū)別于聯(lián)系,需要的朋友可以參考下
    2015-01-01
  • C/C++?Linux?Socket網(wǎng)絡(luò)編程流程分析

    C/C++?Linux?Socket網(wǎng)絡(luò)編程流程分析

    這篇文章主要介紹了C/C++?Linux?Socket網(wǎng)絡(luò)編程,Linux環(huán)境中的C/C++?socket?與Window環(huán)境中的C/C++?socket類似,本文所記錄的是TCP協(xié)議的socket編程,圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • C/C++中的靜態(tài)變量注意事項(xiàng)

    C/C++中的靜態(tài)變量注意事項(xiàng)

    本文主要介紹了C/C++中的靜態(tài)變量注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C++雙指針的實(shí)踐

    C++雙指針的實(shí)踐

    雙指針?biāo)惴ㄍㄟ^(guò)設(shè)置兩個(gè)指針遍歷數(shù)據(jù)結(jié)構(gòu),有效優(yōu)化時(shí)間和空間復(fù)雜度,適用于鏈表操作、數(shù)組處理和字符串匹配等場(chǎng)景,本文就來(lái)詳細(xì)的介紹一下C++雙指針,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-11-11
  • C/C++如何實(shí)現(xiàn)兩矩陣相乘之模擬法

    C/C++如何實(shí)現(xiàn)兩矩陣相乘之模擬法

    C++矩陣運(yùn)算矩陣運(yùn)算包括矩陣相加、相減、相乘、轉(zhuǎn)置、求逆矩陣等等,用計(jì)算機(jī)程序?qū)崿F(xiàn)矩陣運(yùn)算的方法算法很多,這篇文章主要給大家介紹了關(guān)于C/C++如何實(shí)現(xiàn)兩矩陣相乘之模擬法的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • C++中初始化二維數(shù)組的幾種常見(jiàn)方法

    C++中初始化二維數(shù)組的幾種常見(jiàn)方法

    本文詳細(xì)介紹了在C++中初始化二維數(shù)組的不同方式,包括靜態(tài)初始化、循環(huán)、全部為零、部分初始化、std::array和std::vector,以及std::vector作為動(dòng)態(tài)二維數(shù)組的靈活性和應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2025-04-04

最新評(píng)論

吴旗县| 曲阳县| 黄骅市| 丹江口市| 桓仁| 阜平县| 古交市| 敖汉旗| 隆尧县| 木里| 且末县| 丰台区| 阜康市| 新干县| 通辽市| 邵阳市| 婺源县| 敖汉旗| 连城县| 和硕县| 尚志市| 旅游| 安顺市| 佳木斯市| 宁蒗| 惠来县| 故城县| 吐鲁番市| 菏泽市| 内丘县| 手游| 大石桥市| 平顶山市| 大埔区| 庐江县| 兴义市| 海南省| 佳木斯市| 准格尔旗| 修文县| 平安县|