1.自定義頭文件
在C中,編寫的頭文件如果不在標準頭文件目錄中是無法使用尖括號包括的,只能使用""包括,例如:
#include"目錄/頭文件名"
或者如果頭文件在需要編譯的文件的當前目錄下,可以不用加目錄名
#include"頭文件名"
2.使用尖括號包括
如果要使用尖括號包括頭文件,有兩種方法
1.將頭文件移動到標準頭文件目錄,linux為/usr/local/include.windows下為C:\MinGW\include
2.編譯時指定頭文件目錄,gcc -I/頭文件目錄 ...... 編譯時-I參數就是用於指定頭文件目錄
3.靜態庫
將文件編譯為靜態庫,可以將多個目標文件保存為一個存檔,在linux中存檔命令為"ar",例如
ar -rcs libmylib.a source1.o source2.o
參數r表示如果.a文件存在,則更新它,c表示創建存檔時不反饋信息,s表示在.a文件開頭建立索引,文檔名必須以lib開頭,否則編譯器無法找到該存檔
編譯時使用靜態庫的方法為使用-l參數,如果該靜態庫處在標準目錄(linux下為/usr/local/lib)中,則無需指定目錄,如果不在標準目錄中,需要使用-L參書指定靜態庫所處的目錄,例如
gcc test.c -L/my_lib -lmylib -o test
3.使用靜態庫實例
創建頭文件hellow.h,how.h,c文件hellow.c,how.c,main.c,以及一個Makefile文件
- hellow.h
void hellow();
- how.h
void how();
做完之後可以將兩個頭文件移動到標準頭文件目錄下,如果不移動,後面的makefile文件需要使用-I參數,指定頭文件目錄為當前目錄
- hellow.c
#include<hellow.h>
#include<stdio.h>
void hellow()
{
printf("hellow world\n");
}
- how.c
#include<how.h>
#include<stdio.h>
void how()
{
printf("how are you\n");
}
- main.c
#include<stdio.h>
#include<hellow.h>
#include<how.h>
int main()
{
hellow();
how();
return 0;
}
- Makefile文件
#include<hellow.h>
#include<how.h>
hellow.o:hellow.c
gcc -c hellow.c -o hellow.o
how.o:how.c
gcc -c how.c -o how.o
libgreet.a:hellow.o how.o
ar -rcs libgreet.a hellow.o how.o
run:main.c libgreet.a
gcc main.c -L. -lgreet -o run
- 運行make run
[root@izhqmn61154vmrz libTest]# make run
gcc -c hellow.c -o hellow.o
gcc -c how.c -o how.o
ar -rcs libgreet.a hellow.o how.o
gcc main.c -L. -lgreet -o run
- 運行run
[root@izhqmn61154vmrz libTest]# ./run
hellow world
how are you
- 由上面的實例可以看出,靜態庫是由不同的目標代碼組件而成的,需要先編譯.o文件,再創建.a文檔,再將它們鏈接成可執行程序,一旦用這些獨立的目標代碼創建了可執行程序,就沒辦法修改組成靜態庫的目標文件,除非重新編譯.o文件,創建.a文檔…,這也是它被稱為靜態庫的原因
4.動態庫
靜態庫在生成執行文件後無法修改組成執行文件中的目標代碼,而動態庫通過將目標代碼分別保存在單獨的文件中,在程序運行時才將之動態的鏈接到一起,從而實現了可以修改目標文件的目的
- 創建動態庫
將目標代碼轉換為動態庫之前,需要先將它編譯為.o目標文件:
gcc -fPIC -c source.c -o source.o
-fPIC表示想創建位置無關代碼,在linux中必須加這個參數,然後創建動態庫
gcc -shared source.o -o source.so
-shared選項將.o文件轉化為動態庫,在linux中動態庫被稱為共享目標文件,後綴名為.so,而在windows中,動態庫被稱為動態鏈接庫,後綴名為.dll
- 動態庫使用實例
創建頭文件hellow.h,c文件hellow.c,main.c將頭文件放在上一級目錄的includes目錄中,同時創建libs目錄,文件內容與靜態庫使用的文件相同
- 將hellow.c文件編譯為.o文件
gcc -I../includes -fPIC -c hellow.c -o hellow.o
- 將.o文件編譯為動態庫文件
gcc -shared hellow.o -o ../libs/libhellow.so
- 鏈接main函數程序
gcc -I../includes -c main.c -o main.o
gcc main.o -L../libs -lhellow -o main
- 運行
[root@izhqmn61154vmrz libTest]# ./main
hellow you
在linux中,需要將自定義的lib目錄導入變量LD_LIBRARY_PATH中,所以在創建libs文件夾後,需要執行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/libs
後才能運行,否則會顯示找不到動態庫
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。