LINUX C/C++ 动态 载入/引用 函式库/函数库(so/dll)「linux_C_so_project」


资料来源: https://codertw.com/程式语言/430351/


GITHUB:https://github.com/jash-git/linux_C_so_project


01.LIB_CODE (caculate.c)

#include 

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

int sub(int a, int b)
{
    return (a - b);
}

int mul(int a, int b)
{
    return (a * b);
}

int div(int a, int b)
{
    return (a / b);
}


02.EXE_CODE (test_so.c)

#include 
#include 
#include 

//动态连结库路径
#define LIB_CACULATE_PATH "./libcaculate.so"

//函式指标
typedef int (*CAC_FUNC)(int, int);

int main()
{
	void *handle;
	char *error;
	CAC_FUNC cac_func = NULL;
	//开启动态连结库
	handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY);
	if (!handle)
	{
		fprintf(stderr, "%s\n", dlerror());
		exit(EXIT_FAILURE);
	}

	//清除之前存在的错误
	dlerror();
	
	//获取一个函式
	*(void **) (&cac_func) = dlsym(handle, "add");
	if ((error = dlerror()) != NULL)
	{
		fprintf(stderr, "%s\n", error);
		exit(EXIT_FAILURE);
	}
	printf("add: %d\n", (*cac_func)(2,7));

	cac_func = (CAC_FUNC)dlsym(handle, "sub");
	printf("sub: %d\n", cac_func(9,2));

	cac_func = (CAC_FUNC)dlsym(handle, "mul");
	printf("mul: %d\n", cac_func(3,2));

	cac_func = (CAC_FUNC)dlsym(handle, "div");
	printf("div: %d\n", cac_func(8,2));

	//关闭动态连结库
	dlclose(handle);
	exit(EXIT_SUCCESS);
}


03.编译so

    gcc -fPIC -shared caculate.c -o libcaculate.so 


04.编译执行档

    gcc -rdynamic -o main test_so.c -ldl

相关文章