hello1.c ———————————————————— #include <stdio.h>
void printDog() { printf("hello dog"); }
_________________________________________________ hello2.c #include <stdio.h>
void printCat() { printf("hello cat"); } ____________________________________________________ main.c void print1(int); void print2(char *);
int main() { helloDog(); helloCat(); }
可以看到main.c要用到helloDog.c中的print1函數和hello2.c中的print2函數。是以可以把這兩個函數組合為庫,以供更多的程式作為元件來調用。
方法一:将hello1.c和hello2.c編譯成靜态連結庫.a[[email protected] main5]#gcc -c helloDog.c helloCat.c //将hello1.c和hello2.c分别編譯為helloDog.o和helloCat.o,其中-c選項意為隻編譯不連結。 [[email protected] main5]#ar -r libhello.a helloDog.o helloCat.o //将hello1.o和hello2.o組合為libhello.a
(一定要以lib開頭)這個靜态連結庫 [[email protected] main5]#cp libhello.a /usr/lib //将libhello.a拷貝到/usr/lib目錄下,作為一個系統共享的靜态連結庫 [[email protected] main5]#gcc -o main main.c -lhello //将main.c編譯為可執行程式main,這個過程用到了-lhello (這個hello要跟libhello.a的紅色部分對應)選項,這個選項告訴gcc編譯器到/usr/lib目錄下去找
libhello.a(一定要以lib開頭)的靜态連結庫 [[email protected] main5]#./main helloDog helloCat
方法二:将helloDog.o和helloCat.o組合成動态連結庫.so[[email protected] main5]#gcc -c -fpic helloDog.c helloCat.c //将helloDog.c和helloCat.c編譯成helloDog.o和helloCat.o,-c意為隻編譯不連結,-fpic意為位置獨立代碼,訓示編譯程式生成的代碼要适合共享庫的内容這樣的代碼能夠根據載入記憶體的位置計算内部位址。 [[email protected] main5]#gcc -shared helloDog.o helloCat.o -o hello.so //将helloDog.o和helloCat.o組合為shared object,即動态連結庫 [[email protected] main5]#cp hello.so /usr/lib //将hello.so拷貝到/usr/lib目錄下 [[email protected] main5]#gcc -o hello hello.c /usr/lib/hello.so(貌似要用絕對路徑,) //将hello.c編譯連結為hello的可執行程式,這個過程用到了動态連結庫hello.so [[email protected] main5]#./main helloDog helloCat