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、解析方式
RTLD_LAZY:在dlopen返回前,對於動態庫中的未定義的符號不執行解析(只對函數引用有效,對於變數引用總是立即解析)。
RTLD_NOW: 需要在dlopen返回前,解析出所有未定義符號,如果解析不出來,在dlopen會返回NULL,錯誤為:: undefined symbol: xxxx.......
2、作用范圍
RTLD_GLOBAL:動態庫中定義的符號可被其後打開的其它庫重定位。
RTLD_LOCAL: 與RTLD_GLOBAL作用相反,動態庫中定義的符號不能被其後打開的其它庫重定位。如果沒有指明是RTLD_GLOBAL還是RTLD_LOCAL,則預設為RTLD_LOCAL。
3、作用方式
RTLD_NODELETE: 在dlclose()期間不卸載庫,並且在以後使用dlopen()重新載入庫時不初始化庫中的靜態變數。這個flag不是POSIX-2001標准。
RTLD_NOLOAD: 不載入庫。可用於測試庫是否已載入(dlopen()返回NULL說明未載入,否則說明已載入),也可用於改變已載入庫的flag,如:先前載入庫的flag為RTLD_LOCAL,用dlopen(RTLD_NOLOAD|RTLD_GLOBAL)後flag將變成RTLD_GLOBAL。這個flag不是POSIX-2001標准。
RTLD_DEEPBIND:在搜索全局符號前先搜索庫內的符號,避免同名符號的沖突。這個flag不是POSIX-2001標准。