陳詞濫調C說話靜態函數庫的制造和應用。本站提示廣大學習愛好者:(陳詞濫調C說話靜態函數庫的制造和應用)文章只能為提供參考,不一定能成為您想要的結果。以下是陳詞濫調C說話靜態函數庫的制造和應用正文
C說話的函數庫是多組經由驗證的經常使用函數的聚集,編寫C說話法式時應用庫函數,既可以進步法式運轉效力,又可以進步編程質量,應用辦法如#include 和#include。
依據應用庫函數時,函數庫加載機會的差別,將函數庫分為靜態函數庫和靜態函數庫,詳細差別是:C說話法式假如應用靜態函數庫的函數,那末全部函數庫的代碼都邑和C說話法式一路編譯成可履行代碼,法式的體積會收縮;假如應用靜態函數庫的函數,則C說話法式只會和函數庫文件名和函數名一路編譯成可履行代碼(不編譯函數代碼),運轉時去查找函數庫文件和函數體,法式的體積根本不變。
簡略歸納綜合就是,靜態函數庫是“以空間換時光”,增長法式體積,削減運轉時光,假如靜態函數庫產生轉變,則全部法式必需從新編譯,由於函數庫被整合到了終究可履行代碼中;靜態函數庫則是“以時光換空間”,增長運轉時光,削減法式體積,假如靜態函數庫產生轉變,法式不必從新編譯,由於函數庫沒有整合到終究可履行代碼中。
Linux中靜態函數庫表現為”libxxx.a”,windows中後綴名為”.lib”;Linux中靜態函數庫表現為”libxxx.so”,windows中後綴名為”.dll”。函數庫中寄存內容包含:(1)函數稱號,(2)函數量標代碼(二進制),(3)重定位信息(鏈接須要)等。
1 靜態函數庫的制造和應用
靜態函數庫的制造步調可以用下圖來描寫,詳細包含
(1)編寫函數的.c文件(例如add.c、sub.c、mul.c和div.c)
(2)編寫Makefile,然後make,完成函數的編譯和歸檔入庫
函數的編譯:應用gcc –c 只編譯不鏈接函數.c文件,分離生成函數的目的文件(例如add.o、sub.o、mul.o和div.o)。
函數的歸檔入庫:應用ar -rc libxxx.a $(objects) 將目的文件歸檔入庫。
(3)編寫頭文件(例如ku.h),聲明靜態函數庫中的一切函數,目標是kumain.c函數#include頭文件後,可以挪用響應的函數,至此,完成函數庫的制造。
1.1 靜態函數庫的制造示例
示例的內容是樹立靜態函數庫libstatic.a,庫中包含add、sub、mul和div函數,然後在kumain.c函數中援用這4個函數,完成兩個整數的加減乘除,全部文件的構造是
(1) 編寫函數的.c文件
編寫4個函數文件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)編寫頭文件
// 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)編寫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文件到函數庫libstatic.a中,完成靜態函數庫的制造。
1.2 靜態函數庫的應用
(1)編寫kumain.c,挪用libstatic.a中的add、sub、mul和div函數
// 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文件,運轉./kumain.o檢查運轉成果,勝利。
1.3 應用nm檢查kumain.o中的符號信息
nm敕令是列出.o文件,.a文件和.so文件中的符號信息,如符號的值,符號類型及符號稱號等。符號平日指界說出的函數,全局變量等。
應用 nm libstatic.a檢查符號信息,獲得
應用nm kumain.o >label.text檢查kumain.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敕令簡介
nm [option(s)] [file(s)]
有效的options:
-A 在每一個符號信息的後面打印地點對象文件稱號;
-C 輸入demangle過了的符號稱號;
-D 打印靜態符號;
-l 應用對象文件中的調試信息打印出地點源文件及行號;
-n 依照地址/符號值來排序;
-u 打印出那些不決義的符號;
罕見的符號類型
A 該符號的值在往後的鏈接中將不再轉變;
B 該符號放在BSS段中,平日是那些未初始化的全局變量;
D 該符號放在通俗的數據段中,平日是那些曾經初始化的全局變量;
T 該符號放在代碼段中,平日是那些全局非靜態函數;
U 該符號不決義過,須要自其他對象文件中鏈接出去;
W 未明白指定的弱鏈接符號;同鏈接的其他對象文件中有它的界說就用上,不然就用一個體系特殊指定的默許值。