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\n", dlerror());
    exit(EXIT_FAILURE);
  }
  dlerror();
  cac_func = (CAC_FUNC)dlsym(handle, "add");
  if (cac_func)
  {
    printf("add: %d\n", cac_func(2, 7));
  }
  cac_func = (CAC_FUNC)dlsym(handle, "sub");
  if (cac_func)
  {
    printf("sub: %d\n", cac_func(9, 2));
  }
  cac_func = (CAC_FUNC)dlsym(handle, "mul");
  if (cac_func)
  {
    printf("mul: %d\n", cac_func(3, 2));
  }
  cac_func = (CAC_FUNC)dlsym(handle, "div");
  if (cac_func)
  {
    printf("div: %d\n", 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,“一切皆服务,一切皆应用”

gcc dynamic load library的更多相关文章

  1. Linux Dynamic Shared Library && LD Linker

    目录 . 动态链接的意义 . 地址无关代码: PIC . 延迟版定(PLT Procedure Linkage Table) . 动态链接相关结构 . 动态链接的步骤和实现 . Linux动态链接器实 ...

  2. How to Use the Dynamic Link Library in C++ Linux (C++调用Delphi写的.so文件)

    The Dynamic Link Library (DLL) is stored separately from the target application and shared among dif ...

  3. DYNAMIC LINK LIBRARY - DLL

    https://www.tenouk.com/ModuleBB.html MODULE BB DYNAMIC LINK LIBRARY - DLL Part 1: STORY What do we h ...

  4. Unreal: Dynamic load map from Pak file

    Unreal: Dynamic load map from Pak file 目标:在程序运行时加载自定义 Pak 文件,并打开指定关卡,显示其中的完整 map 内容 Unreal 的 Pak 文件内 ...

  5. Walkthrough: Create and use your own Dynamic Link Library (C++)

    参考网站:https://docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-librar ...

  6. java.lang.UnsatisfiedLinkError: Unable to load library 'xxx': Native library (win32-x86-64/ID_Fpr.dll)

    使用 JNA 调用 dll 库,因为 dll 库是32 位的,而 jvm 是 64位的,所以发生的错误: java.lang.UnsatisfiedLinkError: Unable to load ...

  7. xvfb启动PyQt4程序报Unable to load library icui18n错误

    xvfb启动PyQt4程序报如下错误: Unable to load library icui18n "Cannot load library icui18n: (libicui18n.so ...

  8. Walkthrough: Creating and Using a Dynamic Link Library (C++)

    Original Link: http://msdn.microsoft.com/zh-cn/library/ms235636.aspx Following content is only used ...

  9. Custom Action : dynamic link library

    工具:VS2010, Installshield 2008 实现功能: 创建一个C++ win32 DLL的工程,MSI 工程需要调用这个DLL,并将Basic MSI工程中的两个参数,传递给DLL, ...

随机推荐

  1. CentOs安装和使用

    ● 去掉图形界面 http://blog.csdn.net/op_zoro/article/details/44993881 ● centos 7覆盖windows vi /boot/grub2/gr ...

  2. 异常详细信息: System.ArgumentException: 不支持关键字: “metadata”。

    ASP.NET MVC中报的一个错误... 异常详细信息: System.ArgumentException: 不支持关键字: “metadata”. 其实这个是我修改web.config文件造成的, ...

  3. vins-mono代码分析

    vins-mono的关键帧选择策略 1 与前一帧的平均视差.如果跟踪特征的平均视差超过某个阈值,我们会将此图像视为关键帧. 2 另一个是跟踪质量.如果跟踪特征的数量低于一个阈值,我们把这一帧看做一个新 ...

  4. RMQ算法详解

    RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法. 当然这个问题用线段树同样能够解决,算法复杂度为:O(N)~O(logN) . ...

  5. BZOJ 3224 - 普通平衡树 - [Treap][Splay]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...

  6. [No0000167]CPU内部组成结构及指令执行过程

    计算机的基本硬件系统由运算器.控制器.存储器和输入.输出设备五大部件组成.运算器和控制器等部件被集成在一起统称为中央处理单元(Central Processing Unit,CPU). CPU的功能 ...

  7. sed中支持变量的处理方法

    1.eval sed ’s/$a/$b/’ filename2.sed "s/$a/$b/" filename3.sed ’s/’$a’/’$b’/’ filename 4.sed ...

  8. python——二分查找算法

    从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半   二分查找: 在一段数字内,找到中间值,判断要找的值和中间值大小的比较. 如果中间值大一些,则在 ...

  9. 将DOS格式的shell脚本转为UNIX格式

    shell脚本是UNIX格式,在修改其中内容时,务必保持UNIX格式.UE编辑器打开时,会询问是否转为DOS格式,请点否.如果修改完成后,不能确认是否为DOS格式,可以使用UE文件菜单下的Conver ...

  10. falsk 与 django cookie和session存、取、删的区别

    falsk cookie的存取删需导入from flask import Flask,make_response,request# 存COOKIE的方法@app.route('/setcookie') ...