python-调用动态链接库dll/so的方法

文章目录

  • 一、linux环境
    • 1.函数编写
    • 2.编译为动态链接库so
    • 3.使用python调用
    • 4.检查动态链接库中的符号表
    • 5.添加extern "C"防止函数名被编译器修饰
  • 二、Windows环境
    • 1.编写test.cpp
    • 2.编译test.dll
    • 3.在python中调用
    • 4.运行结果
    • 可以看到输出了1+3的结果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9b834a8156f5418798c257295b9a69f0.png)


一、linux环境

1.函数编写

编写一个简单的示例代码,用于进行简单的加法运算

#include 

// 一个简单的函数,将两个整数相加
int add(int a, int b) {
    return a + b;
}

2.编译为动态链接库so

gcc -shared -o example.so -fPIC example.c

3.使用python调用

将.py与.so文件放在同一目录下,在python中编写代码如下:

import ctypes

# 加载动态链接库
lib = ctypes.CDLL('./example.so')  # 请替换为你生成的动态链接库的路径

# 调用动态链接库中的函数
result = lib.add(3, 5)
print("Result of addition:", result)

4.检查动态链接库中的符号表

运行.py,结果报错找不到函数:
python-调用动态链接库dll/so的方法_第1张图片
这时可以使用该命令检查

nm -g example.so | grep add

发现add函数实际变成了
在这里插入图片描述
在python中改变函数名,输出正常
在这里插入图片描述
在这里插入图片描述

5.添加extern "C"防止函数名被编译器修饰

可以使用 extern “C” 来告诉编译器不要对函数名进行修饰。这在 C++ 中非常有用,因为 C++ 编译器会默认进行名称修饰,而 C 编译器不会。

#include 

// 一个简单的函数,将两个整数相加
extern "C" {
int add(int a, int b) {
    return a + b;
}
}

编译后查看,函数名为add
在这里插入图片描述

···

二、Windows环境

1.编写test.cpp

#include 

extern "C" {
    int add(int a, int b) {
        return a + b;
    }
}

2.编译test.dll

使用gcc编译器编译
python-调用动态链接库dll/so的方法_第2张图片

3.在python中调用

import ctypes

example_dll = ctypes.CDLL('d:/test.dll')

result = example_dll.add(1,3)
print("Result of addition:", result)

4.运行结果

可以看到输出了1+3的结果:
python-调用动态链接库dll/so的方法_第3张图片

你可能感兴趣的:(python基础,linux嵌入式开发,python,开发语言,linux,windows)