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