linux下gcc編譯生成.out,.o,.a,.so文件

1、文件類型介紹

.out是可執行文件,相當於win上的exe;

.o是編譯中間目標文件,相當於win上的.obj;

.a是靜態庫,多個.o練鏈接得到,用於靜態鏈接;

.so是共享庫,用於動態鏈接,相當於win上.dll;

2、out可執行文件生成

main.cpp

#include <stdio.h>
int main()
{
    printf("hello world!\n");
    return 0;
}

編譯cpp:

gcc main.cpp -o a.out

執行a.out:

./a.out

結果:

3、o目標文件生成

hello.cpp

#include <stdio.h>

void hello()
{
    printf("hello!\n");
}

生成.o文件:

gcc -c hello.cpp

得到hello.o,由於是中間文件,所以無法執行

4、a靜態庫生成

(1)創建靜態庫

由.o文件創建靜態庫靜態庫文件名的命名規範是以lib爲前綴,緊接着跟靜態庫名,擴展名爲.a。

例如:我們將創建的靜態庫名爲hello,則靜態庫文件名就是libhello.a。

生成.a文件:

ar -cr libhello.a hello.o

結果:

(2)調用靜態庫

main.cpp

#include <stdio.h>
void hello();
int main()
{
    hello();
    return 0;
}

編譯main.cpp,靜態鏈接libhello.a:

gcc main.cpp libhello.a -o main.out

5、so共享庫生成

(1)創建so

由.o文件創建動態庫文件動態庫文件名命名規範和靜態庫文件名命名規範類似,也是在動態庫名增加前綴lib,但其

文件擴展名爲.so。

例如:我們將創建的動態庫名爲hello,則動態庫文件名就是libhello.so。

生成so文件:

gcc -shared -fPIC -o libhello.so hello.o

我們執行,發現報錯了:

這是因爲在生成hello.o時,沒有使用-fPIC選項,所以我們使用

gcc -c -fPIC hello.cpp

重新生成一下hello.o,再次執行生成so命令。

(2)調用so

編譯main.cpp:

gcc -o main.out main.cpp -L. -lhello

執行,我們發現報錯了:

我們發現報錯了,原來是找不到動態庫文件libhello.so,程序在運行時,會在/usr/lib和/lib等目錄中查找需要的動態庫文件。

若找到,則載入動態庫,否則將提示類似上述錯誤而終止程序運行。

我們將文件libhello.so移動到目錄/usr/lib中,再運行main.out,已經可以正常調用so了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章