课程实验要求完成斐波那契数列的几种实现方法并比较时间复杂度
完成之后我想要将计算第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下倒是很顺利, 没遇到什么坑爹问题