在dlopen的函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。
1、函数出处
#include
void * dlopen( const char * pathname, int mode );
2、参数介绍
mode是打开方式,其值有多个,不同操作系统上实现的功能有所不同,在linux下,按功能可分为三类:
1、解析方式
3、作用方式
3、返回值
打开错误返回NULL
成功,返回库引用
4、实例
/*测试函数main.c(编译时候要加入-ldl(指定dl库))*/ #include
#include
#define NONE "\033[m" #define RED "\033[0;32;31m" extern int g_count; int main(int argc, char argv) { void* pdlhandle; char* pszerror; int (*mytest)(int num); pdlhandle = dlopen("./libtest.so", RTLD_LAZY); pszerror = dlerror(); if (0 != pszerror) { printf("%s", pszerror); return 1; } mytest = dlsym(pdlhandle, "test"); pszerror = dlerror(); if (0 != pszerror) { printf("%s", pszerror); return 1; } mytest(3); //defined in test.c (libtest.c) printf(RED"[%s %s]"NONE": g_count=%d\n",__FILE__, __FUNCTION__, g_count); //[%s %s]以赤色 打印 dlclose(pdlhandle); return 0; }
#include "add.h" int g_count; int add(int num) { g_count +=num; printf("[%s %s]: g_count=%d\n",__FILE__, __FUNCTION__, g_count); return 0; }
#include "stdio.h" #include "stdlib.h" #include "unistd.h" extern int g_count; int add(int num);
生成libtest.so动态库文件test.c
#include "add.h" #define NONE "\033[m" #define BLUE "\033[0;32;34m" int test(int num) { add(num); //defined in add.c (libadd.so) printf(BLUE"[%s %s]"NONE": g_count=%d\n",__FILE__, __FUNCTION__, g_count); //[%s %s]以蓝色打印 return 0; }
CROSS= #CROSS=/gcc-4.2/arm-linux- CC = $(CROSS)gcc LDFLAGS = -L. -Wl,-rpath,./ LIBS = -ltest -ladd -ldl OBJS = main.o DYNLIB = libadd.so libtest.so TARGET = test ALL: $(DYNLIB) $(TARGET) $(TARGET): $(OBJS) $(CC) $(LDFLAGS) $(LIBS) $(OBJS) -o $(TARGET) $(OBJS): main.c $(CC) -c $^ $< $(DYNLIB): $(CC) -fPIC -shared add.c -o libadd.so $(CC) -fPIC -shared test.c -o libtest.so clean: rm -f *.o rm -f *.so rm -f $(TARGET)
注意:Makefile中 -Wl,-rpath,./将加载动态库的路径写到代码里,这就不必要应用export LD_LIBRARY_PATH=./来指定查找共享库的路径。
libtest.so 凭借libadd.so, 这时在main()中调用dlopen()来加载libtest.so时,碰到不能理会的标记(g_count)时,他会加载libadd.so. 并不是本身之前灵活地认为 ,dlopen()只会加载libtest.so, 而不去理会libadd.so中的标记.
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229008.html原文链接:https://javaforall.net
