麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統(tǒng) > Solaris > 正文

solaris中有類似windows的DLL有關(guān)的函數(shù)嗎?

2024-07-26 00:29:38
字體:
供稿:網(wǎng)友
發(fā)信人: cpu (奔騰的心), 信區(qū): Solaris 
標 題: Re: solaris中有類似windows的DLL有關(guān)的函數(shù)
發(fā)信站: 華南網(wǎng)木棉站 (Fri Aug 7 19:36:46 1998), 轉(zhuǎn)信 

【 在 irene (yoyo) 的大作中提到: 】 
: 如題 
呵呵當(dāng)然有,window那套動?xùn)|東很多機制都是抄unix的 
比如system(32)/*.dll是就是仿照unix的/usr/lib/*.so 
unix的/usr/lib/*.so就是unix的動態(tài)庫(dynamic library) 
給程序動態(tài)鏈接用的,反之/usr/lib/*.a是靜態(tài)庫,程序編譯 
鏈接時就將相關(guān)函數(shù)鏈入目標文件。 

實際上泥cc -o yyy yyy.o -lXXX那個XXX就是告訴cc找/usr/lib/libXXX.so.. 
yyy.o聲明調(diào)用了libXXX.so中的函數(shù),鏈接成功的目標文件yyy在運行時將動態(tài) 
調(diào)用libXXX.so的函數(shù),至于cc -o yyy yyy.o libxxx.a那就不同了呵呵 
cc對-l參數(shù)的缺省鏈接方式是動態(tài)鏈接,即只鏈接符號,不鏈入函數(shù)實體。 
對鏈接方式可man ld。 

言歸正傳,既然有動態(tài)庫,就肯定有與之相關(guān)的函數(shù),window有LoadLibrary, 
偶solaris有dlopen,就是dynamic library open,window能讓泥做 
土版DLL,偶solaris早就能讓泥自己生產(chǎn).so了呵呵,下面具體說明怎樣調(diào)用 
動態(tài)庫libXXX里的函數(shù)而又不需要在cc中指定-lXXX。 

首先是dlopen,格式: 

#include 
void * dlopen(const char *pathname, int mode); 
返回一個void *類型的handle,否則返回NULL。 

pathname就是泥所要打開的動態(tài)庫,如果這個庫聲明鏈接了其它庫,即對其它 
庫有依賴關(guān)系,那么所有相關(guān)有依賴關(guān)系的庫都會被打開,這些打開的庫稱之 
為組(group)。 

mode是打開方式: 

RTLD_LAZY:打開動態(tài)庫后只重定位庫中數(shù)據(jù)地址引用而不重定位而函數(shù)引用, 
函數(shù)引用在該函數(shù)要被激活時才定位,的確LAZY呵呵,但省開銷;) 
RTLD_NOW: 與上者相比,動態(tài)庫一被打開就重定位所有函數(shù)的引用。 

RTLD_GLOBAL:打開動態(tài)庫里的全局符號可以被其它所有庫重定位。 
RTLD_LOCAL: 打開動態(tài)庫里的全局符號只能被同組庫重引用。 
RTLD_GROUP: 只有相關(guān)組的符號才允許重定位?? 
RTLD_PARENT:發(fā)dlopen調(diào)用的對象中的符號對被dlopen對象可見。 
RTLD_WORLD: 。。。呵呵太晦澀了我翻譯的我都看不明白;( 

總之,一個RTLD_LAZY已經(jīng)夠用了呵呵;) 

然后是得到重定位的數(shù)據(jù)或函數(shù)引用: 
#include 
void *dlsym(void *handle, const char *name) 
意義明顯,handle即dlopen的返回值,name即泥要引用的在動態(tài)庫變量或函 
數(shù)名稱。成功返回重定位后的符號地址,失敗返回NULL。 

最后是關(guān)閉動態(tài)庫:int dlclose(void *handle), 
一看就明白,懶得解釋了;) 

下面給一個例子增加感性認識,該例子調(diào)用動態(tài)庫client.so中的函數(shù) 
int client_request(char *),該函數(shù)返回0或-1并根據(jù)不同錯誤設(shè)置 
字符串err_info(也定義在client.so中): 

# include 
# include 
# include 

# define TRUE 0 
# define FALSE -1 

main( ) 

char buf[64]; 
void *handle; /* 動態(tài)庫句柄 */ 
char *err_info; /* 要引用的動態(tài)庫中的一個變量 */ 
int (*client_request)(char *); /* 要引用的一個函數(shù) */ 

/* 打開動態(tài)庫client.so */ 
if ((handle = dlopen("client.so", RTLD_LAZY)) == NULL) { 
perror("dlopen"); 
exit(-1); 


/* 得到函數(shù)名client_request的引用 */ 
if ((client_request = 
(int (*)(char *))dlsym(handle, "client_request")) == NULL) { 
perror("dlsym client_request"); 
exit(-1); 


/* 得到變量名err_info的引用 */ 
if ((err_info = 
(char *)dlsym(handle, "err_info")) == NULL) { 
perror("dlsym err_info"); 
exit(-1); 

for(;;) { 
gets(buf); /* 從標準輸入讀入命令串 */ 
if (strcmp(buf, "exit") == TRUE) { 
dlclose(handle); /* 關(guān)閉動態(tài)庫 */ 
return 0; 

PRintf("request:%s/n", buf); 
client_request(buf); /* 調(diào)用動態(tài)庫中的函數(shù) */ 
printf("ask: %s/n", err_info); /* 引用動態(tài)庫中的變量 */ 




最后是編譯問題,怎樣編譯成.so文件呢?很簡單用ld或者cc -G就可以了,比如: 
cc -G yyy.so yyy.o others.o -ldl 
如果這個yyy.o有引用了其它動態(tài)庫的函數(shù)呢?那么用cc -G ... -l了 
比如yyy.o引用了socket函數(shù),那么 
cc -G yyy.so yyy.o others.o -ldl -lsocket即可。 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 99这里精品 | 成人福利在线 | 91精品国产日韩91久久久久久360 | 久久蜜桃精品一区二区三区综合网 | 久久蜜桃精品一区二区三区综合网 | 蜜桃网站在线 | 国产一级毛片国语版 | 欧美2区 | 黄色片免费在线 | 久久精国 | qyl在线视频精品免费观看 | 成人毛片视频在线观看 | 激情视频日韩 | 国产日韩线路一线路二 | chinesehdxxxx无套 久久另类视频 | 欧美日韩亚洲另类 | 黑人一区二区 | 国产精品成人一区二区三区电影毛片 | 素人视频在线观看免费 | 在线观看第一区 | 99精品视频在线看 | 99精品在线视频观看 | 一级毛片在线观看免费 | 91香焦视频 | av日韩在线免费观看 | 91精品动漫在线观看 | 极品销魂一区二区三区 | 国产妞干网 | 久久久久久久爱 | www.成人在线视频 | 欧美黄色一级片在线观看 | 成人性生活视频在线观看 | 国产一区二区三区在线免费观看 | 91精品国产日韩91久久久久久360 | 久久久久久久久久久av | 亚洲精品无码不卡在线播放he | 黄色网址电影 | 成人18在线| 最新亚洲视频 | www.91pron| 国产69精品久久久久久久久久 |