将C/C++编译为动态链接库并供python调用其函数

课程实验要求完成斐波那契数列的几种实现方法并比较时间复杂度

完成之后我想要将计算第n项的耗时作图画出来

用C++作图没做过,很麻烦

在网上看了看,最后选择了将C++代码编译为动态链接库,然后用python调用其接口

要让函数能被外部程序调用,需要对函数声明做一定处理

在windows下,要被外部调用的函数要被声明为

// windows下声明对外调用的函数

extern "C" __declspec(dllexport) int fib(int n);

声明方式不止这一种,不同的声明方式对应到python导入时也不同

Linux 下 不需要 __declspec(dllexport),  但在windows下这必须的

// Linux 外部调用函数的声明

extern "C" int fib(int n);

也可以用宏定义简化前缀, 比如, windows下

#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT int fib(int n);

编写完代码后, 将代码编译为动态链接库, windows下为 .dll,  Linux下为 .so

g++编译命令如下

# Linux
g++ fib.cpp -shared -fPIC  -o fib.so

# Windows
g++ fib.cpp -shared -fPIC  -o fib.dll

然后就可以尝试用python调用了

from ctypes import *

# Windows
fib = cdll.loadLibrary("./fib.dll")
# 或者
fib = CDLL("./fib.dll")

# Linux
fib = cdll.loadLibrary("./fib.so")
# 或者
fib = CDLL("./fib.so")

#调用函数,计算fib(10)
fib.fib(10)

运气好的人到这里就结束了,运气不好的人就会遇到很多莫名其妙的问题,还找不到解决办法

 

我将我的代码一通改造并编译成 .dll 后, 用python加载库, 加载不了,报了一个找不到文件或其依赖的错误, 至今没找到解决方法

FileNotFoundError: Could not find module 'e:\Code\C&C++\test.dll' (or one of its dependencies). Try using the full path with constructor syntax.

通过 几个小时 的尝试定位到了错误表象:  只要代码里面包含了C++的头文件, 生成的 .dll 就没办法被python加载进来

又花了几个小时找解决方法, 没找到, 也没发现别人和我提到我这同一个问题

用dependency walker 查看dll, 发现一推 API-MS-WIN-CORE-xxx.dll 找不到, 也不知道怎么弄才行

我放弃了

最后是在wsl下编译成 .so 文件 先完成了作业, Linux下倒是很顺利, 没遇到什么坑爹问题

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值