Linux动态使用共享库

起因

  这篇应该是补充linux学习笔记5-共享库,使用共享库的另外一种方式.对应Windows的这篇Windows动态库使用.

共享库代码(头文件,本次没有用到)

#ifndef SHARE_H
#define SHARE_H

#ifdef __cplusplus
extern "C"
{
#endif
int add(int a,int b);

int min(int a,int b);

int max(int a,int b);

#ifdef __cplusplus
}
#endif

#endif

共享库代码(主文件)

int add(int a,int b)
{
	return a + b;
}

int min (int a,int b)
{
	return a < b?a:b;
}

int max(int a,int b)
{
	return a > b? a :b;
}

gcc -o libshare.so -fPIC -shared share.c

使用共享库

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main(int argc, char *argv[])
{
	char *error;     //错误消息
	void *handle;    //用于接收共享库的入口地址

					 //声明函数指针,用于接收动态加载共享库指定函数的地址
	typedef int(*Add)(int a, int b);


	//加载共享库
	//参数一 指定共享库名称和路径(这里和程序同一目录)
	//参数二 指定那种方式加载共享库,这里是延迟加载(在使用的时候,才会去加载共享库)
	handle = dlopen("./libshare.so", RTLD_LAZY);
	if (handle == NULL)
	{
		fprintf(stderr, "load share library failed:%s\n", dlerror());
		exit(1);
	}

	//dlsym通过共享库的入口地址,找到add函数的地址
	Add add = dlsym(handle, "add");  
	if ((error = dlerror()) != NULL)
	{
		fprintf(stderr, "load function address failed:%s\n", dlerror());
		exit(1);
	}

	int result = add(10, 30);
	fprintf(stdout, "function execute result:%d\n", result);

	//在使用结束,一定要dlclose关闭(卸载)该共享库
	if (dlclose(handle) < 0)
	{
		fprintf(stderr, "free share library failed:%s\n", dlerror());
		exit(1);
	}
	return 0;
}


//使用共享库 ,生成要加参数指定
gcc -o share_lib -rdynamic -ldl share_lib.c

效果


秋风 2017-04-25