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\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,“一切皆服务,一切皆应用”

时间: 2024-10-17 21:35:49

gcc dynamic load library的相关文章

注意 electron 的 Error: A dynamic link library (DLL) initialization routine failed

把dll的load放在Electron中,就会报一个错: Error: A dynamic link library (DLL) initialization routine failed 这显然就是dll没有加载成功,为什么在Node中已经试过没问题的方法会在Electron中出问题,我此刻内心是惶恐的,因为Electron是我们最终的javascript运行容器,如果这种加载外部库的方式不可用,那意味着之前的一些技术方案都要重来,怀着忐忑的心情,我搜了一下,好在有非常贴合的问题并有相当具体的

ERROR: could not load library "D:/Program Files/PostgreSQL/9.3/lib/postgis-2.1.dll": Invalid access to memory location.

ERROR:  could not load library "D:/Program Files/PostgreSQL/9.3/lib/postgis-2.1.dll": Invalid access to memory location. 这个错误,参照:http://trac.osgeo.org/postgis/ticket/2476 原因可能是这个表跟postgis有关系,里面一个字段是使用函数产生的: 这里提示说,重启下服务,就奇迹般的没有这个问题了:.... ERROR: c

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

xvfb启动PyQt4程序报如下错误: Unable to load library icui18n "Cannot load library icui18n: (libicui18n.so.48: cannot open shared object file: No such file or directory)" 解决方法: sudo apt-get install libicu48 参考:https://forums.virtualbox.org/viewtopic.php?f=

Dynamic load data by scrollview

The  demo generate from 北京尚学堂 package com.example.scrollview; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.os.Bundle; import android.view.LayoutInflat

Exception in thread &quot;main&quot; java.lang.UnsatisfiedLinkError: Unable to load library &#39;dll.msvcrt&#39;

上网找了一下方法,说是jdk64的问题,也有说是路径不对问题. 代码片段 1 public interface CLibrary extends Library { 2 CLibrary INSTANCE = (CLibrary) Native.loadLibrary("dll.msvcrt", 3 CLibrary.class); 4 void printf(String format, Object... args); 5 } 在看到以下文章之后,觉得loadLibrary()加载

Custom Action : dynamic link library

工具:VS2010, Installshield 2008 实现功能: 创建一个C++ win32 DLL的工程,MSI 工程需要调用这个DLL,并将MSI工程中的两个参数,传递给DLL, 参数1:Property 表中的 ProductName 参数2:操作 MSI 工程的 installer database 的 Handle 对参数1的操作:通过对话框的方式显示出来. 对参数2的操作:读取 Property 表中的 ProductName 属性,通过对话框的方式显示出来. 步骤一.VS20

SevenZip.SevenZipLibraryException: Can not load 7-zip library or internal COM error! Message: failed to load library.

SevenZip.SevenZipLibraryException: Can not load 7-zip library or internal COM error! Message: failed to load library.解决方案 问题原因:就是你的系统版本是64位,然后你用了32位的dll(或者反过来) 解决方案:https://github.com/gdoujkzz/7zdll/tree/master/7z 这里面有32位的和64位7zdll.

Android JNI找不到第三方库的解决方案 cannot load library

最近做一个jni项目,拿到的so库需要用jni封装一层,等于是在jni的C++代码里调用第三方库的方法,然后整个项目在Android上运行出结果. 自己用jni生成的so是libaa.so 使用的第三方库是libbb.so. 到目前为止,遇到的问题是libbb各种找不到.libbb库去哪儿了? E/AndroidRuntime(11626): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_i

Linux Programe/Dynamic Shared Library Entry/Exit Point &amp;&amp; Glibc Entry Point/Function

目录 1. 引言 2. C/C++运行库 3. 静态Glibc && 可执行文件 入口/终止函数 4. 动态Glibc && 可执行文件 入口/终止函数 5. 静态Glibc && 共享库 入口/终止函数 6. 动态Glibc && 共享库 入口/终止函数 1. 引言 0x1: glibc Any Unix-like operating system needs a C library: the library which defines t