Linux下生成 so檔案

2021-07-15 18:05:38 字數 2453 閱讀 3456

linux下的.so檔案即shared libraries。shared library 是程式執行時載入的庫檔案。當乙個shared library 被成功的安裝以後,之後啟動的所有程式都會自動使用最新的shared library。也就是說,生成乙個.so檔案並告訴編譯器它的位置之後,所有的需要引入它的程式都可以同時呼叫它。

使用.so檔案有以下這麼幾個好處:

每乙個shared library都有乙個soname、乙個real name、乙個linker name。

soname有乙個字首lib、自定義的短語、後跟乙個.so、還有乙個版本號。如:/usr/lib/libreadline.so.3

real name是乙個soname的實體,在檔名中包涵了真實的庫版本號。real name相比soname新增了乙個句點,乙個次要版本號,另乙個句點,和乙個髮型版本號。最後乙個句點和發行版本號是可選的。次要號碼和發行號碼支援配置控制,使別人可以明白安裝的是哪個確切的版本。

linker name是沒有任何版本號的soname。如/usr/lib/libreadline.so。

管理shared libraries的關鍵就是將這個檔名拆開。當程式內部列出它們需要的shared libraries時,僅僅需要列出soname即可。相反的,當建立乙個shared library時,你只需要建立乙個特定的檔名(包括詳細的版本資訊)即可。當你安裝了乙個新版本的庫時,你只需將它安裝在一小部分特殊的資料夾中的乙個之中,然後執行程式ldconfig。lgconfig將會檢查現存的檔案,並且建立real name的soname和symbolic link,同時設定好春村檔案。快取檔案位於/etc/ld.so.cache。

ldconfig並不設定linker name;通常這是在庫安裝時幹的事,然後linker name作為指向最新soname或者realname的symbolic link被建立。

symbolic link(軟連線)是自己指定的。名字如: /usr/lib/libreadline.so.3.0。

linker name就是乙個與/usr/lib/libreadline.so.3相關聯的symbolic link。

如果以上看不懂的話,是的我也沒看懂,只是大體翻譯了這篇文章

ld_library_path

這個路徑中的庫檔案將被在正常尋找前首先尋找。

.so檔案(也就是shared libraries)必須以lib開頭,以.so結尾,比如:libalpha.so。(作為特例,一些最低階的c庫並不是以lib開頭的)

必須將自定義的檔案加入到ld_library_path中才能執行。

aplusb.c

#include 

#include "aplusb.h"

using

namespace

std;

int aplusb(int a, int b)

aplusb.h

#ifndef aplusb_h__

#define aplusb_h__

extern

int aplusb(int a, int b);

#endif

main.c

#include 

#include "aplusb.h"

using

namespace

std;

int main(void)

第一步:建立pic檔案

g++ -c -fpic aplusb.c

pic**是位置無關**,程式執行時計算機會找檔案中指定的記憶體位址去讀取資料,但是當讀取乙個庫檔案時,庫本身指定的位址必須是與記憶體位址無關的。此時生成了aplusb.o。注意-fpic比-fpic相容性要高。

-c 為編譯和彙編但是不鏈結。

生成的.o檔案為機器碼。

第二步:用第一步生成的檔案去建立.so檔案。

g++ -shared -o libaplusb.so aplusb.o

第三步:鏈結

g++ -l/home/lee/jni -o main main.c -laplusb

第四步: 保證執行時可以呼叫

$ export ld_library_path=/home/lee/jni:$ld_library_path至此

第五部:執行

lee@lee-computer:~/jni$ ./main

3

結果為3。呼叫成功。

linux下生成 so檔案和 a檔案

test.h 1 ifndef test h 2 define test h 34 void testa 5void testb 67 endif test a.cpp 1 include 2 include test.h 3 4void testa 5 test b.cpp 1 include 2...

linux下生成 so檔案和 a檔案

1.o 就相當於windows裡的obj檔案 乙個.c或.cpp檔案對應乙個.o檔案 a 是好多個.o合在一起,用於靜態連線 即static mode,多個.a可以鏈結生成乙個exe的可執行檔案 so 是shared object,用於動態連線的,和windows的dll差不多,使用時才載入。得到了...

linux 下生成動態庫 so並引用

動態庫的引入及減少了主 檔案的大小,同時生成的動態庫又是動態載入的,只有執行的時候才去載入,linux 下的 動態庫 so 就像windows下的 dll一樣。有關動態庫的概念自行上網搜。一下是建立及引用動態庫 test so.h ifndef test so h define test so h ...