linux下動(dòng)態(tài)加載動(dòng)態(tài)庫(kù),主要用到dlopen(),dlsym(),dlclose(),dlerror()四個(gè)函數(shù),他們所使用的頭文件
dlopen() 功能:打開(kāi)一個(gè)動(dòng)態(tài)鏈接庫(kù)
包含頭文件:
#include <dlfcn.h>
函數(shù)定義:
void * dlopen( const char * pathname, int mode );
函數(shù)描述:
在dlopen的()函數(shù)以指定模式打開(kāi)指定的動(dòng)態(tài)連接庫(kù)文件,并返回一個(gè)句柄給調(diào)用進(jìn)程。使用dlclose()來(lái)卸載打開(kāi)的庫(kù)。
mode:分為這兩種
RTLD_LAZY 暫緩決定,等有需要時(shí)再解出符號(hào)
RTLD_NOW 立即決定,返回前解除所有未決定的符號(hào)。
RTLD_LOCAL
RTLD_GLOBAL 允許導(dǎo)出符號(hào)
RTLD_GROUP
RTLD_WORLD
返回值:
打開(kāi)錯(cuò)誤返回NULL
成功,返回庫(kù)引用
編譯時(shí)候要加入 -ldl (指定dl庫(kù))
例如
gcc test.c -o test -ldl
下面舉個(gè)例子,同時(shí)考慮到幾個(gè)細(xì)節(jié)。
/***********************main.c的內(nèi)容**************************/
#include<stdio.h>
#include<dlfcn.h>
int main()
{
int a,b;
void *pHandle;
typedef int (*func)(int,int); //注意函數(shù)的定義,這里要根據(jù)下面的max函數(shù)格式定義。
scanf("%d%d",&a,&b);
pHandle=dlopen("./dl2.so",RTLD_NOW);
if (!pHandle)
{
cerr << "Cannot open library: " << dlerror() << ' ';
return 1;
}
func=(func)dlsym(pHandle,"max");
const char *dlsym_error = dlerror();
if (dlsym_error) {
cerr << "Cannot load symbol 'baidu': " << dlsym_error <<' ';
dlclose(pHandle);
return 1;
}
printf("%d與%d相比,%d為大數(shù)。\n",a,b,(*func)(a,b));
dlclose(pHandle);
}
/***********************main.c的內(nèi)容**************************/
/***********************testmax.c的內(nèi)容**************************/
#include<stdio.h>
int max(int x,int y)
{
return x>y?x:y;
}
/***********************testmax.c的內(nèi)容**************************/
編譯:
gcc testmax.c -shared -fPIC -o testmax.so
gcc -o main -ldl main.c
運(yùn)行:
admin@admin-desktop:/abc/test$ ./main
2008 2012
2008與2012相比,2012為大數(shù)。
很淺層的東西,這樣下次你直接修改你的testmax.c文件,編譯成動(dòng)態(tài)庫(kù)拷貝到main目錄,不用編譯,直接可以加載你最新修改的testmax中的函數(shù),前提是函數(shù)名、格式要相同。