㈠ 動態庫調用主程序全局變數
這樣恐怕不行,簡單的方法是用參數傳,或者用文件傳,共享內存都可以。
㈡ linux對動態庫函數的調用太慢
動態庫函數在載入程序時,資料庫將被載入。但是,動態載入程序鏈接器將符號解析推遲到函數調用時間。在對共享庫的調用是通過過程鏈接表(PLT)中的一個條目間接完成的。最初,PLT中的所有條目都指向ld.so。在第一次調用函數時,ld.so查找符號的實際地址,更新PLT中的條目,並跳轉到函數。這是「懶惰」符號解析。您可以設置LD_BIND_NOW環境變數來更改此行為。除此之外,試一下不用DLL直接把函數卸載程序里的運行速度,如果仍然慢,那就是演算法的問題。
㈢ 請教關於android linux動態庫.so的載入調用
1、 .so動態庫的生成
可使用gcc或者g++編譯器生成動態庫文件(此處以g++編譯器為例)
g++ -shared -fPIC -c XXX.cpp
g++ -shared -fPIC -o XXX.so XXX.o
2、 .so動態庫的動態調用介面函數說明
動態庫的調用關系可以在需要調用動態庫的程序編譯時,通過g++的-L和-l命令來指定。例如:程序test啟動時需要載入目錄/root/src/lib中的libtest_so1.so動態庫,編譯命令可照如下編寫執行:
g++ -g -o test test.cpp –L/root/src/lib –ltest_so1
(此處,我們重點講解動態庫的動態調用的方法,關於靜態的通過g++編譯命令調用的方式不作詳細講解,具體相關內容可上網查詢)
Linux下,提供專門的一組API用於完成打開動態庫,查找符號,處理出錯,關閉動態庫等功能。
下面對這些介面函數逐一介紹(調用這些介面時,需引用頭文件#include <dlfcn.h>):
1) dlopen
函數原型:void *dlopen(const char *libname,int flag);
功能描述:dlopen必須在dlerror,dlsym和dlclose之前調用,表示要將庫裝載到內存,准備使用。如果要裝載的庫依賴於其它庫,必須首先裝載依賴庫。如果dlopen操作失敗,返回NULL值;如果庫已經被裝載過,則dlopen會返回同樣的句柄。
參數中的libname一般是庫的全路徑,這樣dlopen會直接裝載該文件;如果只是指定了庫名稱,在dlopen會按照下面的機制去搜尋:
a.根據環境變數LD_LIBRARY_PATH查找
b.根據/etc/ld.so.cache查找
c.查找依次在/lib和/usr/lib目錄查找。
flag參數表示處理未定義函數的方式,可以使用RTLD_LAZY或RTLD_NOW。RTLD_LAZY表示暫時不去處理未定義函數,先把庫裝載到內存,等用到沒定義的函數再說;RTLD_NOW表示馬上檢查是否存在未定義的函數,若存在,則dlopen以失敗告終。
2) dlerror
函數原型:char *dlerror(void);
功能描述:dlerror可以獲得最近一次dlopen,dlsym或dlclose操作的錯誤信息,返回NULL表示無錯誤。dlerror在返回錯誤信息的同時,也會清除錯誤信息。
3) dlsym
函數原型:void *dlsym(void *handle,const char *symbol);
功能描述:在dlopen之後,庫被裝載到內存。dlsym可以獲得指定函數(symbol)在內存中的位置(指針)。如果找不到指定函數,則dlsym會返回NULL值。但判斷函數是否存在最好的方法是使用dlerror函數,
4) dlclose
函數原型:int dlclose(void *);
功能描述:將已經裝載的庫句柄減一,如果句柄減至零,則該庫會被卸載。如果存在析構函數,則在dlclose之後,析構函數會被調用。
3、 普通函數的調用
此處以源碼實例說明。各源碼文件關系如下:
test_so1.h和test_so1.cpp生成test_so1.so動態庫。
test_so2.h和test_so2.cpp生成test_so2.so動態庫。
test_dl.cpp生成test_dl可執行程序,test_dl通過dlopen系列等API函數,並使用函數指針以到達動態調用不同so庫中test函數的目的。
㈣ Linux的dlsym系列函數對動態庫函數調用的問題!
你先確認一下抄 dlopen 和 dlsym 是否確實成功 (返回值是否為 NULL?)。估計其中某一步肯定失敗了,而你沒有檢查返回值,後面函數調用的時候自然就出段錯誤了。
從你自己的描述上看,代碼和操作本身沒有問題。 這個問題肯定也和 add 是幾個參數無關。
㈤ linux 怎麼使用動態庫里的函數
nm可列出.o .a .so中的符號信息,包括諸如符號的值,符號類型及符號名稱等。所謂符號,通常指內定義出的函數,全局變容量等等。
舉個栗子:
nm -D libname.so
nm [option(s)] [file(s)]
有用的options:
-A 在每個符號信息的前面列印所在對象文件名稱;
-C 輸出demangle過了的符號名稱;
-D 列印動態符號;
-l 使用對象文件中的調試信息列印出所在源文件及行號;
-n 按照地址/符號值來排序;
-u 列印出那些未定義的符號;
㈥ linux c編程調用系統的動態庫時,要使用dlopen等函數嗎
linux調用庫的方式有三種:
1.靜態鏈接庫
2.動態鏈接庫
3.動態載入庫
其中1,2都是在編程時直接調用,在鏈接時加參數-l進行鏈接
第三種需要在編程時使用dlopen等函數來獲取庫裡面函數的定義,然後進行調用.
不過對於沒有提供頭文件的動態庫,只能dlopen等函數來調用
㈦ 怎麼條用linux中動態鏈接庫裡面的函數
在dlopen()函數以指定模式打開指定的動態鏈接庫文件,並返回一個句柄給dlsym()的調用進程。使用dlclose()來卸載打開的庫。
當庫被裝入後,可以把 dlopen() 返回的句柄作為給 dlsym() 的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數的指針,並且調用裝載庫中的相應函數。
㈧ linux c++動態庫 調用 c動態庫函數
先把.cpp編譯成動態庫,編譯方法:
g++ *.cpp –fPIC –shared –o libtest.so -libyourclib.so
其中,*.cpp表示你的.cpp文件,你可以把它們一一列出,
–fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的,所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
–shared:指明編譯成動態庫。
libtest.so即為生成的動態庫,以lib開頭,方便後面使用
-libyourclib.so 是你的c動態庫名
編譯好之後,就可以來編譯你的測試程序了:
gcc test.c -o test -ltest
其中,test是生成的可執行程序
-ltest表示引用生成的動態庫libtest.so
大概過程就是這樣,你先試一試