程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 陳詞濫調C說話靜態函數庫的制造和應用

陳詞濫調C說話靜態函數庫的制造和應用

編輯:關於C++

陳詞濫調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 未明白指定的弱鏈接符號;同鏈接的其他對象文件中有它的界說就用上,不然就用一個體系特殊指定的默許值。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved