C语言 静态库制作(亲测可行)
文章目錄
-
-
- 靜態庫簡介
- 靜態庫制作
-
- 代碼實現
- 創建靜態庫
- 鏈接使用靜態庫
-
?
靜態庫簡介
靜態庫的本質就是將多個目標文件打包成一個庫文件。鏈接靜態庫就是將庫中被調用代碼復制到可執行文件中。使用了靜態庫的可執行文件占用磁盤空間和內容空間都比較大,靜態庫中代碼被修改后,需重新生成庫文件并需重新鏈接庫文件。使用靜態庫的可執行文件無需依賴靜態庫,靜態庫即使被刪除,也可照常運行。執行效率比動態庫相對要高。
靜態庫的文件形式為:lib<庫名>.a
靜態庫制作
代碼實現
假如我們制定一個數學操作的靜態庫,在同一個文件夾下,有如下文件:
– add.c
– add.h
– sub.c
– sub.h
add.c為加法操作實現,sub.c為減法操作實現。
代碼如下:
add.h
#ifndef C_ADD_H #define C_ADD_Hint add(int a, int b);#endif //C_ADD_H- ?
add.c
#include "add.h"int add(int a, int b) {return a + b; }- ?
sub.h
#ifndef C_SUB_H #define C_SUB_Hint sub(int a, int b);#endif //C_SUB_H- ?
sub.c
#include "sub.h"int sub(int a, int b) {return a - b; }- ?
創建靜態庫
首先我們將源代碼編譯為目標文件:
gcc -c add.c sub.c
執行完畢后會生產add.o和sub.o文件。
靜態庫創建使用ar命令;
ar -r libmymath.a add.o sub.o
執行完后,會創建一個libmymath.a文件。
鏈接使用靜態庫
我們為了使用上面的靜態庫,我們在如上相同文件夾下,創建一個main.c文件:
– add.c # 加法實現
– add.h # 加法頭文件
– sub.c # 減法實現
– sub.h # 減法頭文件
– libmymath.a # 靜態庫文件
– main.c # 入口主程序
main.c
#include <stdio.h> #include "add.h" #include "sub.h"int main(void) {int a = 20;int b = 10;printf("%d+%d=%d\n", a, b, add(a, b));printf("%d-%d=%d\n", a, b, sub(a, b));return 0; }- ?
我們使用#include預處理指令包含了sub.h和add.h頭文件,來使用我們制作的mymath靜態庫。
如果我們直接gcc -o main main.c肯定會出錯,因為編譯器不知道add.h和sub.h是哪里來的,也不知道add和sub函數的定義在哪里。
所以我們需要使用-l選項,讓編譯器鏈接到我們制作的靜態庫:
gcc main.c libmymath.a -o main
?
此時在當前目錄生成了main的可執行文件。
運行得到如下:
- ?
靜態庫如果被刪除,不會影響可執行文件的執行。因為靜態庫的代碼被復制到了可執行文件中,作為了可執行文件的一部分,這也是靜態庫和動態庫的部分區別所在。
至此,從靜態庫的制作到鏈接使用就結束了。
總結
以上是生活随笔為你收集整理的C语言 静态库制作(亲测可行)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lua源码分析 - 基础篇 - Lua源
- 下一篇: C语言 共享库(动态库)制作