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 ...