分享

Python如何生成动态库dll文件 python怎么生成dll

 禁忌石 2023-12-03 发布于浙江

说明:windows下的动态链接库相当于linux下的共享库,它可以类比为具有一系列特定函数的接口可供各种程序调用。同时,由于一般安装的python都是64位的,而生成的动态链接库可能是32位的也可能是64位的,这就导致动态链接库在pyhon中调用的时候会出现不匹配的问题。本篇博客意在使用C++生成64位的dll,然后供python调用

目录摘要:

  • 1. 使用工具
  • 2. 64位dll文件的生成
  • 3. Python使用dll
  • 4. 可能遇到的问题

1. 使用工具

  • 软件:VS2019,Pycharm
  • 语言:C++,python

2. 64位dll文件的生成

1.首先打开VS2019,选择创建新项目,项目类型选库,然后选择动态链接库,创建项目。

Python如何生成动态库dll文件 python怎么生成dll_Python如何生成动态库dll文件

2.可以看到项目里面默认有如下几个文件,如果没有的话我们可以自己创建pch.h和pch.cpp

Python如何生成动态库dll文件 python怎么生成dll_python_02

3.我们编辑pch.h和pch.cpp分别如下:

  • pch.h(声明可在外部调用的函数)
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
 
#ifndef PCH_H
#define PCH_H
 
// 添加要在此处预编译的标头
#include "framework.h"
 
extern "C" _declspec(dllexport) int myAdd(int a, int b);
extern "C" _declspec(dllexport) int myMax(int a, int b);
 
#endif //PCH_H
  • pch.cpp(相应函数的定义)
// pch.cpp: 与预编译标头对应的源文件
 
#include "pch.h"
#include<iostream>

using namespace std;

int myAdd(int a, int b)
{
	return a + b;
}
int myMax(int a, int b)
{
	return a > b ? a : b;
}

4.设置生成64位的dll:

将项目修改为Debug/Release版本,然后对应将X86改为X64

Python如何生成动态库dll文件 python怎么生成dll_开发语言_03

点击运行/生成解决方案,可以在项目目录下发现x64文件夹,可以发现里面存在dll,这个dll就是64位的。

Python如何生成动态库dll文件 python怎么生成dll_动态链接库_04


3. Python使用dll

一般情况下我们的python都是64位的,首先将dll文件拷贝到pyhon项目目录下,然后编写代码如下:

from ctypes import *

#create_dll.dll文件里面有myADD/myMax方法
dll = cdll.LoadLibrary('create_dll.dll')
a = dll.myAdd(2,5)
b = dll.myMax(2,5)
print(a)
print(b)

运行成功则证明dll生成无误且可以在Python中调用


4. 可能遇到的问题

使用python调用dll库时经常会出现OSError: [WinError 126] 找不到指定的模块的问题,其原因很有可能是本地路径下找不到被调用dll库需要的其他的dll库依赖。

解决方法即找出被调用dll库所依赖的其他库文件,然后将其放在python的环境路径下。例如你所使用的虚拟环境所在文件夹位venv,则将依赖的dll添加到\venv\Scripts文件夹下问题即解决。

找dll库依赖主要有两种方法:

  1. 使用Dependency Walker
    去官网下载Dependency Walker软件,该软件运行较慢需耐心等待,然后可以使用Everything搜索到对应的dll,复制粘贴即可。
  2. Python如何生成动态库dll文件 python怎么生成dll_python_05

本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多