編譯生成靜態庫文件
1.編輯生成例子程序hello.h,hello.c,main.c
hello.c是函數庫的源程序,其中包括公用函數hello,該函數將在屏幕上輸出(hello XXX)
hello.h為該函數庫的頭文件,main.c為測試庫的主程序。在主程序中調用函數hello
程序1:hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char*name)
#endif//HELLO_H
程序2 :hello.c
#include<stdio.h>
void hello(const char *name)
{
printf("Hello %s!\n",name);
}
程序3 :main.c
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
2,將hello.c編譯成.o文件
無論是靜態庫還是動態庫都是由.o文件創建的。因此,我們必須將源程序hello.c通過gcc先編譯成.o文件
輸入命令 gcc -c hello.c

在文件夾中發現生成了hello.o文件

3.由.o文件創建靜態庫
靜態庫文件名命名規范是以lib為前綴緊接着跟着靜態庫名,擴展名為.a。例如:我們將創建的而靜態庫命名為myhello,則靜態庫文件名就是libmyhello.a。在創建和使用靜態庫時我們需要注意這點,創建靜態庫用ar命令。在系統提示符下輸入以下命令創建靜態庫文件libmyhello.a
#ar -crv libmyhello.a hello.o

4.在程序中使用靜態庫
靜態庫制作完了如何使用它內部的函數呢?
只需要在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然后再gcc命令生成目標文件時指明靜態庫名字,gcc將會從靜態庫中將公用函數連接到目標文件中注意gcc會在靜態庫名前加上前綴lib,然后追加.a得到的靜態庫文件名來查找靜態庫文件。
在程序3:main.c中,我們包含了靜態庫的頭文件hello.h,然后在主程序main中直接調用公用函數hello.下面先生成目標程序hello,運行看看結果如何。
方式一:
gcc -o hello main.c -L. -lmyhello


方式二 :
gcc main.c libmyhello .a -o hello

方法三:
先生成main.o
gcc -c main.c
再生成可執行文件
gcc -o hello main.o libmyhello.a

編譯創建動態庫文件
動態庫文件和靜態庫文件命名方式類似,也是在名字前加前綴lib,后綴便為.so,動態庫myhello文件名文libmyhello.so
創建動態庫文件。
通過如下命令
gcc -shared -fPIC -o libmyhello.so hello.o-c

2.在程序中使用動態庫
使用命令
gcc -o hello main.c -L. -lmyhello

發現由於找不到動態庫文件而出錯,程序運行時會在/user/lib和/lib中查找需要的動態庫文件,如果沒找到就會出現上述錯誤,現在將libmyhello.so復制到目錄user/lib中去

發現完美運行
探究
動態庫和靜態庫同名時會優先選擇哪個庫

將別的文件刪除重新創建o和so 文件

一開始會報錯,只有將庫文件放於usr/lib中才可以運行所以同名的話會優先運行動態庫。
編寫一個簡單的例子程序按照上述方法編譯生成庫文件,連接運行。
比較靜態庫和動態庫所生成的可執行文件
main.c

sub1.h

sub1.c

sub2.h

sub2.c

1.通過gcc命令生成三個.o文件

2.通過ar命令將sub1和sub2生成一個.a 靜態庫文件。

3通過命令將main和庫文件鏈接

查看此可生成的文件的大小等信息。

4生成動態庫文件並將其添加到usr/lib中,在通過命令將其鏈接生成可執行文件

觀察其文件大小可以發現大小略小於使用靜態庫生成的可執行文件。

