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

C語言中三種庫的編譯和使用方法

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

前言

在 C 語言開發(fā)中,將通用功能封裝為獨(dú)立庫是提升代碼復(fù)用性、項(xiàng)目可維護(hù)性的核心手段。本文以自定義簡易 math 庫為例,手把手教你實(shí)現(xiàn)直接編譯、靜態(tài)庫(.a)、動(dòng)態(tài)庫(.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 語言開發(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ù)邏輯,是庫文件的核心代碼。
#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)用庫函數(shù)):主程序文件,引入自定義頭文件,調(diào)用 math 庫中的函數(shù)完成測(cè)試。
#include <stdio.h>
#include "math.h"  // 引入自定義math庫頭文件

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

二、方式 1:直接編譯(簡易版,無獨(dú)立庫)

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

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

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

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

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

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

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

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

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

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

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

  1. 運(yùn)行程序

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

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

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

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

  1. 編譯主程序,鏈接動(dòng)態(tài)庫:命令與靜態(tài)庫完全一致,編譯器會(huì)優(yōu)先匹配.so動(dòng)態(tài)庫:
gcc main.c -L. -lmath -o main
  1. 關(guān)鍵:解決動(dòng)態(tài)庫運(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)前路徑加入庫文件路徑中。

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

以上就是C語言中三種庫的編譯和使用方法的詳細(xì)內(nèi)容,更多關(guān)于C語言庫的編譯和使用的資料請(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語言中scanf與scnaf_s函數(shù)詳解

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

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

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

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

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

    libpng、FreeImage、stb_image都是圖像解析的開源庫,這篇文章主要為大家詳細(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),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C++雙指針的實(shí)踐

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

    雙指針?biāo)惴ㄍㄟ^設(shè)置兩個(gè)指針遍歷數(shù)據(jù)結(jié)構(gòu),有效優(yōu)化時(shí)間和空間復(fù)雜度,適用于鏈表操作、數(shù)組處理和字符串匹配等場景,本文就來詳細(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ù)組的幾種常見方法

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

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

最新評(píng)論

昌都县| 三明市| 白玉县| 九台市| 化德县| 丰原市| 龙门县| 托克托县| 称多县| 郑州市| 焉耆| 广昌县| 图片| 嵊泗县| 忻城县| 通渭县| 孟连| 乐安县| 六枝特区| 东乌珠穆沁旗| 峨眉山市| 北京市| 惠州市| 铜梁县| 邵阳市| 澄江县| 姚安县| 卢龙县| 黄浦区| 涞源县| 布拖县| 来宾市| 西贡区| 通州市| 盐山县| 常州市| 富蕴县| 江城| 称多县| 隆子县| 石门县|