• Linux C动态链接库实现一个插件例子


    实现一个简单的计算动态链接库;升级动态链接库后,在不重新编译主程序的情况下,直接生效。

    lib库:

    #cat math.c
    #include <stdio.h>
    
    int add(int x, int y)
    {
    	return (x + y);
    }
    
    int sub(int x, int y)
    {
    	return (x - y);
    }
    
    int mul(int x, int y)
    {
    	return (x * y);
    }
    
    int div(int x, int y)
    {
    	return (x/y);
    }
    

    生成动态链接库

    #gcc -shared -fPIC -o libmath.so math.c
    

    主程序:

    #cat main.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <dlfcn.h>
    
    typedef int (*cac_func)(int, int);
    
    int main(void)
    {
    	void *handle;
    	char *error;
    	cac_func fp=NULL;
    
    	handle = dlopen("./libmath.so", RTLD_LAZY);
    	if (!handle)
    	{
    		fprintf(stderr, "%s
    ", dlerror());
    		exit(EXIT_FAILURE);
    	}
    
    	dlerror();
    
    	fp = dlsym(handle, "add");
    	if ((error = dlerror()) != NULL)
    	{
    		fprintf(stderr, "%s
    ", error);
    		exit(EXIT_FAILURE);
    	}
    
    	printf("add:%d
    ", fp(1,1));
    
    	return 0;
    }
    
    #gcc -o main.out main.c
    /tmp/ccTdLhjj.o: In function `main':
    main.c:(.text+0x1b): undefined reference to `dlopen'
    main.c:(.text+0x2b): undefined reference to `dlerror'
    main.c:(.text+0x56): undefined reference to `dlerror'
    main.c:(.text+0x67): undefined reference to `dlsym'
    main.c:(.text+0x70): undefined reference to `dlerror'
    collect2: error: ld returned 1 exit status
    

    需要使用 指定使用动态链接库: dl

    #gcc -o main.out -ldl main.c
    

    运行:

    #./main.out
    add:2
    

    修改库:

    #cat  math.c
    #include <stdio.h>
    
    int add(int x, int y)
    {
    	return (x + y + 100);
    }
    
    

    重新编译库:

    #gcc -shared -fPIC -o libmath.so math.c
    

    运行:

    #./main.out
    add:102
    
  • 相关阅读:
    springboot+mybatisplus使用xml找不到mapper的解决办法
    PDF转换成Word文档
    Mybatis-Plus增删改查
    Redis 常用命令
    Java 获取两个List<String>中不同的数据
    controller 返回界面 中文乱码
    Navicat已经成功连接,密码忘记的解决方案
    List数组指定切割
    xml字符串转换成Map
    Java 前一个月的最后一天日期计算
  • 原文地址:https://www.cnblogs.com/muahao/p/10376344.html
Copyright © 2020-2023  润新知