1. 创建共享库
$ gcc -fPIC -shared util.c -o libutil.so
2.测试代码
-
#include <dlfcn.h>
-
/*
-
*
-
* int get_num_test();
-
* 被调用的函数原型
-
*
-
*/
-
-
/* 针对函数原型定义函数指针,并用宏封装 */
-
typedef int (*get_num_test)();
-
#define FUNC_GET_NUM get_num_test
-
-
/* 函数名 */
-
#define FUNC_NAME_GET_NUM "get_num_test"
-
-
/* 全局 */
-
FUNC_GET_NUM myfunc;
-
-
void lib_so_test(void)
-
{
-
char *error;
-
void *handler;
-
/* 加载 */
-
handler = dlopen("./libutil.so", RTLD_NOW);
-
if ( handler == NULL )
-
{
-
fprintf(stderr, "%s\n", dlerror());
-
exit( -1 );
-
}
-
error = dlerror();/* 清空错误信息,避免影响dlsym */
-
/* 获取函数地址 */
-
myfunc = dlsym(handler, FUNC_NAME_GET_NUM);
-
error = dlerror();
-
if ( error != NULL )
-
{
-
fprintf(stderr, "%s\n", dlerror());
-
exit( -1 );
-
}
-
-
/* 调用 */
-
myfunc();
-
-
/* 关闭动态库 */
-
dlclose(handler);
-
}
3.编译时加上-ldl,否则提示dlopen等未定义
$ gcc main.c -ldl
阅读(604) | 评论(0) | 转发(0) |