導航:首頁 > 操作系統 > linux動態庫

linux動態庫

發布時間:2022-01-17 14:14:09

1. linux 把動態庫(libxxx.so)進行靜態鏈接

不行的。要靜態鏈接就要使用靜態庫(libxxx.a).

2. linux為什麼一個動態庫鏈接另一個動態庫不行

沒看明白問題
如果是被調程序載入動態庫,那是自動的,由主調進程環境變數決定。
如果是主調程序載入動態庫,則需dlopen打開文件,dlsym按符號獲取映射地址,也就是函數或全局數據地址。

3. linux動態庫可以不以lib開頭嗎

可以,lib 開頭只是為了方便。例如 gcc 想要調用 libfoobar.so 的函數只要加 -lfoobar 就行了,如果不是lib開頭的需要完整寫出 libfoobar.so,不能用 -l參數。

4. 什麼是linux中的SO動態庫

so動態鏈接庫是對它有依賴關系的程序運行時需要調用的,可以通過命令
ldd 「程序名字」來查看程序調用了哪些動態鏈接庫,系統默認會自動載入/usr/lib/ 等目錄下的動態鏈接庫,如果是源碼安裝的庫,它的動態鏈接庫文件會存在你自定義安裝的目錄的lib下,這時你需要修改/etc/ld.so.conf文件來指定動態鏈接庫的載入路徑,然後運行ldconfig命令來載入動態鏈接庫,ldconfig -v是查看那些動態鏈接庫已經被載入了

5. 如何在linux實現動態的更新一個動態庫

1。可行
2。採用版本標記加軟聯接的辦法.如下:
0)將B.so改名為B.so.1,然後命令行執行ln -s B.so B.so.1
1)用B.so下載新的so,起名為B.so.2
2)生成一個腳本,內有: ln -s B.so B.so.2
3)執行此腳本,可以放到rc.local中,下次開機自動執行.

6. linux下,有幾個.so。如何將這幾個動態庫編譯成一個動態庫

g++ -l*** -l*** -L 庫目錄. 一次g++ 是可以同時連接多個動態庫的.不用把多個動態庫編成一個.

7. linux動態庫和靜態庫的區別

靜態庫:這類庫的名字一般是libxxx.a,xxx為庫的名字。利用靜態函數庫編譯成的文件比較大,因為整個函數庫的所有數據都會被整合進目標代碼中,他的優點就顯而易見了,即編譯後的執行程序不需要外部的函數庫支持,因為所有使用的函數都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜態函數庫改變了,那麼你的程序必須重新編譯。

動態庫:這類庫的名字一般是libxxx.M.N.so,同樣的xxx為庫的名字,M是庫的主版本號,N是庫的副版本號。當然也可以不要版本號,但名字必須有。相對於靜態函數庫,動態函數庫在編譯的時候並沒有被編譯進目標代碼中,你的程序執行到相關函數時才調用該函數庫里的相應函數,因此動態函數庫所產生的可執行文件比較小。由於函數庫沒有被整合進你的程序,而是程序運行時動態的申請並調用,所以程序的運行環境中必須提供相應的庫。動態函數庫的改變並不影響你的程序,所以動態函數庫的升級比較方便。linux系統有幾個重要的目錄存放相應的函數庫,如/lib /usr/lib。

當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。

8. linux中如何將動態鏈接庫嵌入到可執行程序

動態庫是運行時載入,動態庫有自己的載入路徑;運行時會從固定路徑載入;
即需要把動態庫放到固定路徑下;
比如linux的/lib/目錄下

9. linux下的動態庫是如何在程序運行時載入

直接上代碼,祈禱排版不要亂掉,一下源碼來自http://lameck.blog.163.com/blog/static/388113742011111591750149/

//test.h
#ifndef_TEST_H_
#define_TEST_H_
typedefint(*TEST_FUN)(void);
#endif
//test.cgcc-ctest.c-otest.o
//gcc-sharedtest.o-olibtest.so
#include<stdio.h>
#include"test.h"
inttest_fun(void)
{
printf("thisisatest! ");
return0;
}
//main.cgccmain.c-omain-ldl
#include<stdio.h>
#include<stdlib.h>
#include<dlfcn.h>
#include"test.h"

intmain()
{
void*handle=NULL;
TEST_FUNp=NULL;
char*error=NULL;

handle=dlopen("./libtest.so",RTLD_LAZY);
if((error=dlerror())!=NULL)
{
printf("%s ",error);
exit(1);
}
p=(TEST_FUN)dlsym(handle,"test_fun");
if((error=dlerror())!=NULL)
{
printf("%s ",error);
dlclose(handle);
exit(1);
}
p();
dlclose(handle);
return0;
}

主要函數

void * dlopen( const char *pathname, intmode);

void* dlsym(void* handle,const char* symbol);

const char *dlerror(void);

int dlclose (void *handle);

這些基本上可以從函數簽名中得到實際功能和使用方法..

除了mode參數,其他的想必能夠通過閱讀源代碼來學習吧

關於dlopen的mode參數有如下幾個常量:

1、解析方式

2、作用范圍

3、作用方式

閱讀全文

與linux動態庫相關的資料

熱點內容
手機時間如何校正到伺服器 瀏覽:81
創造與魔法瞬移源碼百度 瀏覽:882
反射優化java 瀏覽:874
硬體加密播放盒子 瀏覽:923
xp點擊文件夾選項沒反應 瀏覽:537
蘋果不顯示桌面的app怎麼刪除 瀏覽:864
安卓手機怎麼換國際服 瀏覽:415
神獸領域安卓怎麼下載 瀏覽:250
單片機交通燈ad原理圖 瀏覽:413
多功能解壓磁鐵筆 瀏覽:80
少兒編程火箭升空 瀏覽:401
蘭斯10游戲解壓碼 瀏覽:42
手機proxy伺服器地址 瀏覽:449
吉他清音壓縮 瀏覽:301
簡歷模板程序員 瀏覽:882
螺桿壓縮機虛標型號 瀏覽:953
idea開發項目伺服器ip地址 瀏覽:125
串口伺服器出現亂碼怎麼解決 瀏覽:950
命令按鈕的default 瀏覽:161
戰網如何登錄其他伺服器 瀏覽:990