我的需求是打包一个dll给python调用,遇到的各种问题,
vs2015生成的dll给python调用失败,所以我打算用mingw,这样打包后python调用的时候提示,不是有效的win32程序,百度说是因为mingw不支持打包64位,所有我下载64位
1. mingw 官网 http://mingw-w64.org/doku.php/download
2. 点击箭头打开的是一个类似github的托管网站https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/
为什么选择这个文件,看这篇博客 https://blog.csdn.net/iningwei/article/details/101649090
如果fq不过去,下载这个 https://download.csdn.net/download/u010054790/12670970
下载后找个目录解压就算安装了,然后把里面的bin目录添加的path环境变量,新打开一个cmd 输入gcc -v,有东西代表安装成功。
3. 打包准备共工作
我要创建一个dll,这个dll里有个add_int函数进行两个int类型相加返回和打印,就这么一个简单功能
要创建菜单dll目录,我是Intellij clion创建的一个c项目,三个文件main.c hello.h hello.c 其中两个hello是要生成dll用的,main.c用于测试dll,打包后的dll文件名我设置为hello.dll
hello.h
#ifndef CCPP_HELLO_H
#define CCPP_HELLO_H
extern "C" int add_int(int a, int b);
#endif
hello.c
#include <stdio.h>
int add_int(int a, int b) {
printf("hello.dll executing... result:%d\n", a + b);
return a + b;
}
int fuck() {
return 100;
}
main.c
#include <stdio.h>
#include <windows.h>
typedef int (*Fun)(int, int); //这里声明一个函数指针,typedef 关键字是必须的,好像要显示调用dll中的函数,都需要这样用函数指针给出声明
int main() {
// HINSTANCE hDll;
// HMODULE hDll;
Fun Add;
// hDll = LoadLibrary("hello.dll");
HMODULE hDll = LoadLibrary("hello.dll");
if (hDll == NULL) {
printf("nullll\n");
exit(99);
}
Add = (Fun) GetProcAddress(hDll, "add_int");
printf("Add:%d", Add(23, 45));
// printf("Hello, World!\n");
// printf("RRRRR:%d", add_int(23,45));
return 0;
}
main.c不要管里面的注释,我自己调试用的,dll文件
4. 开始打包,
安装完mingw后,cmd进入项目目录
gcc --shared hello.c -o hello.dll
这样会在目录生成一个hello.dll 这个时候输入gcc main.c 会生成一个a.exe ,直接执行a.exe会输出
hello.dll executing... result:68
Add:68
这代表dll创建成功,
5。引入到python项目里
Python项目目录是D:\\deeplearning.ai\\tensorflow-01\\ccode
把hello.dll也放入这个ccode目录里,cmd 里执行python test.py就完了
test.py 文件如下
from ctypes import *
dll = cdll.LoadLibrary('D:\\deeplearning.ai\\tensorflow-01\\ccode\\hello.dll')
# dll = CDLL("hello.dll")
# dll = cdll.LoadLibrary("hello.dll")
print(dll)
try:
a=dll.add_int(177, 158)
except Exception as err:
print(err)
print(type(a))
print(a)