21xrx.com
2024-11-22 06:58:59 Friday
登录
文章检索 我的文章 写文章
C++动态加载SO库教程
2023-06-29 07:37:01 深夜i     --     --
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++动态加载共享链接库的方法,并提供了完整的代码示例,帮助大家了解如何使用共享链接库。通过使用共享链接库,我们可以更灵活地管理程序代码,实现程序代码的重用,从而提高程序的可维护性和可移植性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复