21xrx.com
2025-03-31 07:24:19 Monday
文章检索 我的文章 写文章
C++动态加载SO库教程
2023-06-29 07:37:01 深夜i     322     0
C++ 动态加载 SO库 教程 编程

C++是一门广泛使用的编程语言,在编写程序的过程中,常常需要使用到动态库。动态库可以提供程序代码的重用,使程序更具可维护性。在C++中,使用动态库的方式有两种:静态链接库和共享链接库。本文将介绍如何使用共享链接库。

共享链接库(也称为动态链接库或者SO库)与静态链接库不同,它是在程序运行时才会被加载到内存中。因此,它具有更高的灵活性和可移植性。接下来,我们将为大家介绍如何使用共享链接库。

1.编写共享链接库的代码

首先,我们需要编写一个共享链接库的代码。我们以简单的数学计算为例,编写一个名为"MathLib.so"的共享链接库。以下是MathLib.h的代码:

#ifndef MATHLIB_H
#define MATHLIB_H
#ifdef _WIN32
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT
#endif
DLLEXPORT int add(int a, int b);
DLLEXPORT int sub(int a, int b);
DLLEXPORT int mul(int a, int b);
DLLEXPORT int div(int a, int b);
#endif

以下是MathLib.cpp的代码:

#include "MathLib.h"
DLLEXPORT int add(int a, int b) {
  return a + b;
}
DLLEXPORT int sub(int a, int b)
  return a - b;
DLLEXPORT int mul(int a, int b) {
  return a * b;
}
DLLEXPORT int div(int a, int b) {
  if (b == 0)
    return -1;
  
  return a / b;
}

在Linux下,将以上代码保存为MathLib.h和MathLib.cpp。在Windows下,需要将MathLib.cpp中的DLLEXPORT改为__declspec(dllexport)。

2.编译共享链接库

在Linux下,我们可以使用以下命令编译共享链接库:

g++ -shared -fPIC MathLib.cpp -o libMathLib.so

在Windows下,我们可以使用以下命令编译共享链接库:

g++ -shared MathLib.cpp -o MathLib.dll

3.使用共享链接库

下面的示例代码展示了如何使用共享链接库。请将以下代码保存为test.cpp文件,并放在与共享链接库相同的目录中。

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include "MathLib.h"
int main() {
  void* handle;
  handle = dlopen("libMathlib.so", RTLD_NOW);
  if (!handle) {
    printf("Failed to open %s\n", dlerror());
    return -1;
  }
  int (*add)(int,int);
  add = (int (*)(int,int))dlsym(handle, "add");
  if (!add) {
    printf("Failed to load symbol: %s\n", dlerror());
    return -1;
  }
  int ret = add(10, 20);
  printf("10 + 20 = %d\n", ret);
  dlclose(handle);
  return 0;
}

在Windows下,需要将dlopen改为LoadLibrary,dlerror改为GetLastError,dlsym改为GetProcAddress。同时,需要将libMathlib.so改为Mathlib.dll。

在上面的代码中,我们使用dlopen函数打开共享链接库,并使用dlsym函数获取函数指针。然后,我们调用add函数计算10+20的结果。

4.编译测试程序

在Linux下,我们可以使用以下命令编译测试程序:

g++ test.cpp -ldl -o test

在Windows下,我们可以使用以下命令编译测试程序:

g++ test.cpp -o test

注意,Windows下需要将共享链接库放在测试程序的同级目录下。

5.运行测试程序

在Linux下,我们可以使用以下命令运行测试程序:

./test

在Windows下,我们可以直接运行test.exe。

6.总结

这篇文章介绍了C++动态加载共享链接库的方法,并提供了完整的代码示例,帮助大家了解如何使用共享链接库。通过使用共享链接库,我们可以更灵活地管理程序代码,实现程序代码的重用,从而提高程序的可维护性和可移植性。

  
  

评论区

请求出错了