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

老生常談C語(yǔ)言靜態(tài)函數(shù)庫(kù)的制作和使用

 更新時(shí)間:2016年08月26日 10:02:06   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇老生常談C語(yǔ)言靜態(tài)函數(shù)庫(kù)的制作和使用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

C語(yǔ)言的函數(shù)庫(kù)是多組經(jīng)過(guò)驗(yàn)證的常用函數(shù)的集合,編寫(xiě)C語(yǔ)言程序時(shí)使用庫(kù)函數(shù),既可以提高程序運(yùn)行效率,又可以提高編程質(zhì)量,使用方法如#include 和#include。

根據(jù)使用庫(kù)函數(shù)時(shí),函數(shù)庫(kù)加載時(shí)機(jī)的差異,將函數(shù)庫(kù)分為靜態(tài)函數(shù)庫(kù)和動(dòng)態(tài)函數(shù)庫(kù),具體差異是:C語(yǔ)言程序如果使用靜態(tài)函數(shù)庫(kù)的函數(shù),那么整個(gè)函數(shù)庫(kù)的代碼都會(huì)和C語(yǔ)言程序一起編譯成可執(zhí)行代碼,程序的體積會(huì)膨脹;如果使用動(dòng)態(tài)函數(shù)庫(kù)的函數(shù),則C語(yǔ)言程序只會(huì)和函數(shù)庫(kù)文件名以及函數(shù)名一起編譯成可執(zhí)行代碼(不編譯函數(shù)代碼),運(yùn)行時(shí)去查找函數(shù)庫(kù)文件和函數(shù)體,程序的體積基本不變。

簡(jiǎn)單概括就是,靜態(tài)函數(shù)庫(kù)是“以空間換時(shí)間”,增加程序體積,減少運(yùn)行時(shí)間,如果靜態(tài)函數(shù)庫(kù)發(fā)生改變,則整個(gè)程序必須重新編譯,因?yàn)楹瘮?shù)庫(kù)被整合到了最終可執(zhí)行代碼中;動(dòng)態(tài)函數(shù)庫(kù)則是“以時(shí)間換空間”,增加運(yùn)行時(shí)間,減少程序體積,如果動(dòng)態(tài)函數(shù)庫(kù)發(fā)生改變,程序無(wú)須重新編譯,因?yàn)楹瘮?shù)庫(kù)沒(méi)有整合到最終可執(zhí)行代碼中。

Linux中靜態(tài)函數(shù)庫(kù)表示為”libxxx.a”,windows中后綴名為”.lib”;Linux中動(dòng)態(tài)函數(shù)庫(kù)表示為”libxxx.so”,windows中后綴名為”.dll”。函數(shù)庫(kù)中存放內(nèi)容包括:(1)函數(shù)名稱(chēng),(2)函數(shù)目標(biāo)代碼(二進(jìn)制),(3)重定位信息(鏈接需要)等。

1 靜態(tài)函數(shù)庫(kù)的制作和使用

靜態(tài)函數(shù)庫(kù)的制作步驟可以用下圖來(lái)描述,具體包括

(1)編寫(xiě)函數(shù)的.c文件(例如add.c、sub.c、mul.c和div.c)

(2)編寫(xiě)Makefile,然后make,實(shí)現(xiàn)函數(shù)的編譯和歸檔入庫(kù)

函數(shù)的編譯:使用gcc –c 只編譯不鏈接函數(shù).c文件,分別生成函數(shù)的目標(biāo)文件(例如add.o、sub.o、mul.o和div.o)。

函數(shù)的歸檔入庫(kù):使用ar -rc libxxx.a $(objects) 將目標(biāo)文件歸檔入庫(kù)。

(3)編寫(xiě)頭文件(例如ku.h),聲明靜態(tài)函數(shù)庫(kù)中的所有函數(shù),目的是kumain.c函數(shù)#include頭文件后,可以調(diào)用相應(yīng)的函數(shù),至此,完成函數(shù)庫(kù)的制作。

1.1 靜態(tài)函數(shù)庫(kù)的制作示例

示例的內(nèi)容是建立靜態(tài)函數(shù)庫(kù)libstatic.a,庫(kù)中包括add、sub、muldiv函數(shù),然后在kumain.c函數(shù)中引用這4個(gè)函數(shù),實(shí)現(xiàn)兩個(gè)整數(shù)的加減乘除,整個(gè)文件的結(jié)構(gòu)是

(1) 編寫(xiě)函數(shù)的.c文件

編寫(xiě)4個(gè)函數(shù)文件add.c、sub.c、mul.c和div.c

// add.c 
float add(int a, int b)
{
 return (a+b);
} 
 // sub.c 
float sub(int a, int b)
{
return (a-b);
} 
 // mul.c 
float mul(int a, int b)
{
return (a*b);
} 
 // div.c 
float div(int a, int b)
{
return (a/b);
} 

(2)編寫(xiě)頭文件

// ku.h 
float add(int a, int b);
float sub(int a, int b);
float mul(int a, int b);
float div(int a, int b);

(3)編寫(xiě)Makefile

### Makefile for static func lib 
objects = add.o sub.o mul.o div.o
 
libstatic.a : $(objects)
   ar -rc libstatic.a $(objects)

add.o : add.c
  gcc -c add.c

sub.o : sub.c
  gcc -c sub.c

mul.o : mul.c
  gcc -c mul.c

div.o : div.c
  gcc -c div.c

clean : 
  rm libstatic.a $(objects)

(4)使用make編譯.c文件,生成.o文件,歸檔.o文件到函數(shù)庫(kù)libstatic.a中,完成靜態(tài)函數(shù)庫(kù)的制作。

1.2 靜態(tài)函數(shù)庫(kù)的使用

(1)編寫(xiě)kumain.c,調(diào)用libstatic.a中的add、sub、mul和div函數(shù)

// kumain.c 
#include <stdio.h>
#include "ku.h" 

int main (void)
{
int a,b;
a = 10;
b = 3;

printf("a = %d.\nb = %d.\n",a,b);
printf("static a+b = %f.\n",add(a,b));
printf("static a-b = %f.\n",sub(a,b));
printf("static a*b = %f.\n",mul(a,b));
printf("static a/b = %f.\n",div(a,b));

return 0;

}

(2)使用gcc kumain.c –o kumain.o –L ./ku2 –lstatic 編譯kumain.c文件,運(yùn)行./kumain.o查看運(yùn)行結(jié)果,成功。

1.3 使用nm查看kumain.o中的符號(hào)信息

nm命令是列出.o文件,.a文件和.so文件中的符號(hào)信息,如符號(hào)的值,符號(hào)類(lèi)型及符號(hào)名稱(chēng)等。符號(hào)通常指定義出的函數(shù),全局變量等。

使用 nm libstatic.a查看符號(hào)信息,得到

使用nm kumain.o >label.text查看kumain.o中的符號(hào)信息,得到

080484f9 T add
0804a020 B __bss_start
0804a020 b completed.6591
0804a018 D __data_start
0804a018 W data_start
t deregister_tm_clones
0804853c T div
080483e0 t __do_global_dtors_aux
08049f0c t __do_global_dtors_aux_fini_array_entry
0804a01c D __dso_handle
08049f14 d _DYNAMIC
0804a020 D _edata
0804a024 B _end
080485c4 T _fini
080485d8 R _fp_hw
t frame_dummy
08049f08 t __frame_dummy_init_array_entry
080487b8 r __FRAME_END__
0804a000 d _GLOBAL_OFFSET_TABLE_
     w __gmon_start__
080482cc T _init
08049f0c t __init_array_end
08049f08 t __init_array_start
080485dc R _IO_stdin_used
     w _ITM_deregisterTMCloneTable
     w _ITM_registerTMCloneTable
08049f10 d __JCR_END__
08049f10 d __JCR_LIST__
     w _Jv_RegisterClasses
080485c0 T __libc_csu_fini
T __libc_csu_init
     U __libc_start_main@@GLIBC_2.0
0804842d T main
T mul
     U printf@@GLIBC_2.0
080483a0 t register_tm_clones
T _start
0804850f T sub
0804a020 D __TMC_END__
T __x86.get_pc_thunk.bx

1.4 nm命令簡(jiǎn)介

nm [option(s)] [file(s)]

有用的options:

-A 在每個(gè)符號(hào)信息的前面打印所在對(duì)象文件名稱(chēng);
-C 輸出demangle過(guò)了的符號(hào)名稱(chēng);
-D 打印動(dòng)態(tài)符號(hào);
-l 使用對(duì)象文件中的調(diào)試信息打印出所在源文件及行號(hào);
-n 按照地址/符號(hào)值來(lái)排序;
-u 打印出那些未定義的符號(hào);

常見(jiàn)的符號(hào)類(lèi)型

A 該符號(hào)的值在今后的鏈接中將不再改變;

B 該符號(hào)放在BSS段中,通常是那些未初始化的全局變量;

D 該符號(hào)放在普通的數(shù)據(jù)段中,通常是那些已經(jīng)初始化的全局變量;

T 該符號(hào)放在代碼段中,通常是那些全局非靜態(tài)函數(shù);

U 該符號(hào)未定義過(guò),需要自其他對(duì)象文件中鏈接進(jìn)來(lái);

W 未明確指定的弱鏈接符號(hào);同鏈接的其他對(duì)象文件中有它的定義就用上,否則就用一個(gè)系統(tǒng)特別指定的默認(rèn)值。

相關(guān)文章

  • 淺談C/C++中的static與extern關(guān)鍵字的使用詳解

    淺談C/C++中的static與extern關(guān)鍵字的使用詳解

    本篇文章是對(duì)C/C++中的static與extern關(guān)鍵字的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++設(shè)計(jì)模式迪米特法則實(shí)例

    C++設(shè)計(jì)模式迪米特法則實(shí)例

    這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式迪米特法則實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • QString的常用方法(小結(jié))

    QString的常用方法(小結(jié))

    這篇文章主要介紹了QString的常用方法(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C++中for auto的用法及說(shuō)明

    C++中for auto的用法及說(shuō)明

    這篇文章主要介紹了C++中for auto的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Qt重寫(xiě)QComboBox實(shí)現(xiàn)下拉展示多列數(shù)據(jù)

    Qt重寫(xiě)QComboBox實(shí)現(xiàn)下拉展示多列數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了Qt如何重寫(xiě)QComboBox實(shí)現(xiàn)下拉展示多列數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • c語(yǔ)言中的移位運(yùn)算符

    c語(yǔ)言中的移位運(yùn)算符

    這篇文章主要介紹了c語(yǔ)言中的移位運(yùn)算符,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 利用Matlab繪制有趣圖像的示例代碼

    利用Matlab繪制有趣圖像的示例代碼

    這篇文章主要為大家總結(jié)了一些利用Matlab繪制的有趣好看的圖像的示例代碼。文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以動(dòng)手試一試
    2022-03-03
  • opencv檢測(cè)直線方法之形態(tài)學(xué)方法

    opencv檢測(cè)直線方法之形態(tài)學(xué)方法

    這篇文章主要為大家詳細(xì)介紹了opencv檢測(cè)直線方法之形態(tài)學(xué)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 通過(guò)c語(yǔ)言調(diào)用系統(tǒng)curl動(dòng)態(tài)庫(kù)的示例詳解

    通過(guò)c語(yǔ)言調(diào)用系統(tǒng)curl動(dòng)態(tài)庫(kù)的示例詳解

    這篇文章中我們將通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)講解如何在Ubuntu系統(tǒng)中通過(guò)C語(yǔ)言調(diào)用動(dòng)態(tài)庫(kù)(共享庫(kù))的方法,我們將使用libcurl庫(kù),這是一個(gè)基于客戶端的URL傳輸庫(kù),廣泛用于各種程序和應(yīng)用中以訪問(wèn)網(wǎng)頁(yè)和服務(wù)器數(shù)據(jù),需要的朋友可以參考下
    2024-03-03
  • C語(yǔ)言實(shí)現(xiàn)順序表的順序查找和折半查找

    C語(yǔ)言實(shí)現(xiàn)順序表的順序查找和折半查找

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)順序表的順序查找和折半查找,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評(píng)論

建德市| 邵阳市| 通辽市| 濉溪县| 泗水县| 甘德县| 新源县| 昌乐县| 绥化市| 崇仁县| 台东市| 盱眙县| 沂南县| 那坡县| 会宁县| 剑阁县| 永善县| 大城县| 连平县| 乐业县| 新田县| 黎川县| 灵山县| 兖州市| 庄河市| 静海县| 沾益县| 金乡县| 仙游县| 滁州市| 台湾省| 田林县| 上虞市| 贵南县| 英山县| 肇庆市| 大化| 临城县| 峨眉山市| 许昌县| 时尚|