linux下檔案的型別是不依賴於其字尾名的,但一般來講:
.o,是目標檔案,相當於windows中的.obj檔案
.so 為共享庫,是shared object,用於動態連線的,和dll差不多
.a為靜態庫,是好多個.o合在一起,用於靜態連線
1、動態庫的編譯
下面通過乙個例子來介紹如何生成乙個動態庫。這裡有乙個標頭檔案:so_test.h,三個.c檔案:test_a.c、test_b.c、test_c.c,我們將這幾個檔案編譯成乙個動態庫:libtest.so。
//so_test.h:
//動態庫檔案頭
#include
#include
void test_a();
void test_b();
void test_c();
//--------------------------------------
//test_a.c:
#include "so_test.h"
void test_a()
//--------------------------------------
//test_b.c:
#include "so_test.h"
void test_b()
//-------------------------------------
//test_c.c:
#include "so_test.h"
void test_c()
將這幾個檔案編譯成乙個動態庫:libtest.so
$ gcc test_a.c test_b.c test_c.c -fpic -shared -o libtest.so
#include "so_test.h"//包含動態庫檔案頭
int main()
{test_a();
test_b();
test_c();
return 0;
$ gcc test.c -l -ltest -o test
2.2測試是否動態連線,如果列出libtest.so,那麼應該是連線正常了
$ ldd test
2.3執行test,可以看到它是如何呼叫動態庫中的函式的。
$./test.o
3、編譯引數解析
最主要的是gcc命令列的乙個選項:
-shared 該選項指定生成動態連線庫(讓聯結器生成t型別的匯出符號表,有時候也生成弱連線w型別的匯出符號),不用該標誌外部程式無法連線。相當於乙個可執行檔案
-l.:表示要連線的庫在當前目錄中
-ltest:編譯器查詢動態連線庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱
ld_library_path:這個環境變數指示動態聯結器可以裝載動態庫的路徑。
4、注意
呼叫動態庫的時候有幾個問題會經常碰到,有時,明明已經將庫的標頭檔案所在目錄 通過 「-i」 include進來了,庫所在檔案通過 「-l」引數引導,並指定了「-l」的庫名,但通過ldd命令察看時,就是死活找不到你指定鏈結的so檔案,這時你要作的就是通過修改 ld_library_path或者/etc/ld.so.conf檔案來指定動態庫的目錄。通常這樣做就可以解決庫無法鏈結的問題了。
qt動態鏈結庫so的生成與呼叫
linux下qt建立和呼叫共享庫檔案.so 費了點功夫,總算get了編寫共享庫 shared library,windows下稱為 動態鏈結庫 即dynamic link library 和呼叫的這個新技能!動態鏈結庫的好處是不言而喻的,乙個稍微複雜一點的程式,頂層設計的時候良好的類庫劃分可以讓工作...
C 生成 呼叫動態鏈結庫
一 需求描述 1 用 生成動態鏈結庫 2 用c 呼叫動態鏈結庫 二 生成動態鏈結庫 1 新建類庫 2 新增welcomeinfo類 如下 僅供測試用,例子很簡單 1 using system 2using system.collections.generic 3using system.linq 4...
GCC編譯生成動態鏈結庫 so檔案
動態庫 so在linux下用c和c 程式設計時經常會碰到,最近在 找了幾篇文章介紹動態庫的編譯和鏈結,總算搞懂了這個之前一直不太了解得東東,這裡做個筆記,也為其它正為動態庫鏈結庫而苦惱的兄弟們提供一點幫助。1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡有乙個標頭檔案 so test...