GCC生成靜態庫.o以及動態庫.so文件及其使用學習


編譯生成靜態庫文件

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

1634361769552

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

1634361787501

3.由.o文件創建靜態庫

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

#ar -crv libmyhello.a hello.o

1634362224672

4.在程序中使用靜態庫

靜態庫制作完了如何使用它內部的函數呢?

只需要在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然后再gcc命令生成目標文件時指明靜態庫名字,gcc將會從靜態庫中將公用函數連接到目標文件中注意gcc會在靜態庫名前加上前綴lib,然后追加.a得到的靜態庫文件名來查找靜態庫文件。

在程序3:main.c中,我們包含了靜態庫的頭文件hello.h,然后在主程序main中直接調用公用函數hello.下面先生成目標程序hello,運行看看結果如何。

方式一:

gcc -o hello main.c -L. -lmyhello

1634362711027

1634362762604

方式二 :

gcc main.c libmyhello .a -o hello

1634362810880

方法三:

先生成main.o

gcc -c main.c

再生成可執行文件

gcc -o hello main.o libmyhello.a

1634362954444

編譯創建動態庫文件

動態庫文件和靜態庫文件命名方式類似,也是在名字前加前綴lib,后綴便為.so,動態庫myhello文件名文libmyhello.so

創建動態庫文件。

通過如下命令

gcc -shared -fPIC -o libmyhello.so hello.o-c

1634363826891

2.在程序中使用動態庫

使用命令

gcc -o hello main.c -L. -lmyhello

1634363953056

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

1634364227661

發現完美運行

探究

動態庫和靜態庫同名時會優先選擇哪個庫

1634399234559

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

1634399331831

一開始會報錯,只有將庫文件放於usr/lib中才可以運行所以同名的話會優先運行動態庫。

編寫一個簡單的例子程序按照上述方法編譯生成庫文件,連接運行。

比較靜態庫和動態庫所生成的可執行文件

main.c

1634400186327

sub1.h

1634400207335

sub1.c

1634400225949

sub2.h

1634400246854

sub2.c

1634400274536

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

1634400510313

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

1634400618796

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

1634400789363

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

1634400820439

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

1634401375372

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

1634401423331


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM