Linux下动态链接库调用
Linux下動(dòng)態(tài)鏈接庫調(diào)用
2014-11-01 10:39 3人閱讀 評(píng)論(0) 收藏 編輯 刪除Linux下動(dòng)態(tài)鏈接庫調(diào)用??
2013-06-08 20:52:48|??分類:集成開發(fā)環(huán)境相關(guān) |舉報(bào)|字號(hào)?訂閱
Linux下的靜態(tài)鏈接庫,做起來比較容易,只要將目標(biāo)文件用ar打包就可以,下面寫一下動(dòng)態(tài)鏈接庫的制作和使用方法,完全是根據(jù)個(gè)人理解和經(jīng)驗(yàn)總結(jié),有不對(duì)的地方還請(qǐng)大家指正。
動(dòng)態(tài)鏈接庫的生成:
代碼上與寫靜態(tài)鏈接庫沒什么區(qū)別,主要是在編譯時(shí),以兩個(gè)文件舉例:
/*mylib.h*/void?Print();
/*mylib.c*/
#include?<stdio.h>
#include?"mylib.h"
void?Print()
{
????printf("This?is?in?mylib\n");
}
編譯方法如下:
gcc -fpic -shared mylib.c -o mylib.so
此時(shí)將生成mylib.so動(dòng)態(tài)鏈接庫文件。
動(dòng)態(tài)鏈接庫在使用時(shí),分為“隱式調(diào)用”和“顯式調(diào)用”兩種。
如果是隱式調(diào)用,則與靜態(tài)庫的使用方法差不多,注意需要包含導(dǎo)出函數(shù)的頭文件,即mylib.h:
#include?<stdio.h>#include?"mylib.h"
int?main()
{
????Print();
}
編譯方法:
gcc -o main main.c -L./ mylib.so
注意要加上動(dòng)態(tài)鏈接庫的搜索路徑,否則編譯器只會(huì)到系統(tǒng)路徑中去尋找。
顯式調(diào)用的方式,不必包含mylib.h,但是需要增加幾個(gè)系統(tǒng)調(diào)用:
#include?<stdio.h>#include?<dlfcn.h>?//?顯式加載需要用到的頭文件
int??main()
{
????void?*pdlHandle?=?dlopen("./mylib.so",?RTLD_LAZY);?//?RTLD_LAZY?延遲加載
????if(?pdlHandle == NULL?)
????{
????????printf("Load?mylib?failed!\n")
????????return?1;
????}
????void?(*Print)()?=?dlsym(pdlHandle,?"Print");?//?定位動(dòng)態(tài)鏈接庫中的函數(shù)
????if(?!Print?)
????{
????????pszErr?=?dlerror();
????????printf("Find?symbol?failed!%s\n",?pszErr);
????????dlclose(pdlHandle);
????????return?1;
????}
????Print();?//?調(diào)用動(dòng)態(tài)鏈接庫中的函數(shù)
????dlclose(pdlHandle);?//?系統(tǒng)動(dòng)態(tài)鏈接庫引用數(shù)減1
????return?0;
}
另外cpp的庫在使用這種方式時(shí)要用extern “C”聲明下,
對(duì)于cpp,類可以在函式中作為局部對(duì)象調(diào)用,如果想使用庫中聲明的類,則要以返回值的形式來產(chǎn)生了。
可以看到,顯式調(diào)用的代碼看上去要復(fù)雜很多,但是卻比隱式調(diào)用要靈活,我們不必在編譯時(shí)就確定要加載哪個(gè)動(dòng)態(tài)鏈接庫,可以在運(yùn)行時(shí)再確定,甚至重新加載。
看一下顯式調(diào)用的編譯方式:
gcc -ldl -o main main.c
注意要添加-ldl選項(xiàng),以使用顯式調(diào)用相關(guān)的函數(shù)調(diào)用。
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Linux下动态链接库调用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态链接概述
- 下一篇: C/C++调用Fortran的使用说明