zoukankan      html  css  js  c++  java
  • gcc dynamic load library

    Linux下一般都是直接在编译生成时挂接上链接库,运行时,把链接库放到系统环境里就可以了

    但是windows出现带来了动态链接的概念,也就兴起了非windows世界的插件的概念的范潮

    对应于windows下的

    LoadLibrary

    GetProcAddress

    FreeLibrary

    Linux提出了

    dlopen

    dlsym

    dlclose

    的相关系统调用

    哎,全是抄啊!!!!

    一把泪

    好了,我想你应该明白怎么回事了吧

    下面,带你进入linux动态加载库的世界

    这个是由libdl库来运作的噢!!!

    //caculate.c

    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;
    }

    //main.c

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


    #define LIB_CACULATE_PATH "./libcaculate.so"


    typedef int(*CAC_FUNC)(int, int);


    int main()
    {
      void *handle = NULL;
      char *error = 0;
      CAC_FUNC cac_func = NULL;
      handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY);
      //handle = dlopen(LIB_CACULATE_PATH, RTLD_NOW);
      if (!handle)
      {
        fprintf(stderr, "%s ", dlerror());
        exit(EXIT_FAILURE);
      }
      dlerror();
      cac_func = (CAC_FUNC)dlsym(handle, "add");
      if (cac_func)
      {
        printf("add: %d ", cac_func(2, 7));
      }
      cac_func = (CAC_FUNC)dlsym(handle, "sub");
      if (cac_func)
      {
        printf("sub: %d ", cac_func(9, 2));
      }
      cac_func = (CAC_FUNC)dlsym(handle, "mul");
      if (cac_func)
      {
        printf("mul: %d ", cac_func(3, 2));
      }
      cac_func = (CAC_FUNC)dlsym(handle, "div");
      if (cac_func)
      {
        printf("div: %d ", cac_func(8, 2));
      }
      dlclose(handle);


      return 0;
    }

    //生成库和调用者

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

    gcc -o main.o -c main.c
    gcc -o main -ldl main.o

    //运行与结果

    我们的调用者main将要调用libcaculate.so动态库

    ./main
    add: 10
    sub: 12
    mul: 24
    div: 2

    Finally:

    看这个世界哪里都一样啊!

    好了,大家去搞插件去吧!!!

    对了,忘了告诉你了,插件已经早就不流行了,哈哈哈

    但我觉得历史是不应该被忘记的,记住这个阶段,对于你应该有重大意义的啊

    现在,我们的这个世界流行的是Web,“一切皆服务,一切皆应用”

  • 相关阅读:
    Google官方关于Android架构中MVP模式的示例续-DataBinding
    值不值
    [译]Godot系列教程五
    [译]Google官方关于Android架构中MVP模式的示例
    遭遇Web print
    如何寻找有价值的点
    充电时间 Go中的数组、切片、map简单示例
    一段良好的程序永远不应该发生panic异常
    居然是Firefox没有抛弃我们
    macOS 升级到了10.12.1
  • 原文地址:https://www.cnblogs.com/woodzcl/p/7605811.html
Copyright © 2011-2022 走看看