21xrx.com
2024-12-27 19:14:36 Friday
登录
文章检索 我的文章 写文章
如何在C++中打包so文件并被Python调用
2023-07-04 16:28:11 深夜i     --     --
C++ SO文件 Python 打包 调用

C++与Python是两种常用的编程语言,它们都有各自的优点和适用范围。而在实际的开发过程中,往往需要将C++编写的功能封装成so文件,然后供Python调用。本文就将介绍如何在C++中打包so文件并被Python调用的方法。

C++中打包so文件的方法:

1. 编写C++代码

首先,我们需要编写C++代码来实现我们想要的功能。这里以一个简单的例子为例,假设我们编写了一个函数,功能是将字符串进行反转。


#include <string.h>

extern "C" char* reverse_string(const char* str) {

  size_t len = strlen(str);

  char* result = new char[len+1];

  for(size_t i=0; i<len; ++i) {

    result[i] = str[len-i-1];

  }

  result[len] = '\0';

  return result;

}

这里我们使用了extern "C"关键字,这是因为C++编译器默认会对函数名进行名称修饰,但我们需要保证函数名在生成so文件后与Python中调用的名称一致,因此需要使用extern "C"来关闭名称修饰。

2. 编译生成so文件

接下来,我们需要将C++代码编译成可供Python调用的so文件。具体命令如下:


g++ -shared -fPIC -o libreverse.so reverse.cpp

其中,-shared表示生成动态链接库,-fPIC表示生成位置独立的代码,o后面是生成so文件的名称,最后是编译的源文件名称。

3. 打包生成的so文件

在生成了so文件后,我们需要将其打包成Python可用的模块。具体方法如下:

首先,创建一个名为reverse的文件夹,在该文件夹下新建__init__.py文件,内容为:


from .reverse import *

然后,将生成的libreverse.so文件复制到reverse文件夹下,并将其重命名为reverse.so,最终文件夹结构如下:


├── reverse

│  ├── __init__.py

│  └── reverse.so

至此,我们已经将C++的功能封装成了Python可调用的模块。

4. 在Python中调用so文件

最后,我们在Python中调用so文件即可使用C++编写的功能了。具体代码如下:


import reverse

result = reverse.reverse_string("hello world")

print(result)

注意,这里的reverse是文件夹名,而不是文件名。我们通过import语句导入reverse模块,并调用reverse_string函数进行测试。

总结:

以上就是在C++中打包so文件并被Python调用的方法。需要注意的是,我们在Python中调用so文件时,需要保证so文件的名称与Python中的模块名一致,并且so文件中的函数名需要与Python中的函数名一致。希望这篇文章能对有需要的读者提供帮助。

  
  

评论区

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