学习记录

师姐使用c++编写的Opengl代码,完成了一些场景生成的功能,由于项目需要,需要用python来调用c++的程序,因此记录一下中间遇到的困难。

1.使用 __declspec(dllexport) 创建 dll 文件

链接: C++中dll文件生成和调用.

根据上图链接流程创建好项目和CreatDll.h,再把本来的项目中其他的.h文件和.cpp文件拷贝到该工程目录下,具体如下图所示:

Python如何动态链接库import python生成动态链接库_Python如何动态链接库import

2.更改.cpp的函数名称

拷贝完原本的头文件和源文件后,其次把该项目配置好,本文将Opengl中的包含目录,库目录,和链接器重新导入,然后,在上图所示的main.cpp文件中,更改了函数名称,我只把main函数的名称改掉。随后在CreatDll.h照猫画虎写入想要调用的函数即可。

Python如何动态链接库import python生成动态链接库_虚拟环境_02


Python如何动态链接库import python生成动态链接库_c++_03

3.生成解决方案

Python如何动态链接库import python生成动态链接库_虚拟环境_04


在生成解决方案中,遇到的问题就是,我生成的事32位dll文件,随后用python调用时,由于python是64位,因此总是报错,错误如下:

OSError: [WinError 193] %1 不是有效的 Win32 应用程序

Python如何动态链接库import python生成动态链接库_c++_05

4.创建32位虚拟环境

首先 cmd中切换到32位模式,

set CONDA_FORCE_32BIT=1

其次创建虚拟环境即可。切换成功不会有任何的提示信息,然后使用conda创建虚拟环境,此时创建出来的虚拟环境就是32位了

conda create --name yourEnv python=3.6;

创建完成后,就可以关闭系统的32位模式

set CONDA_FORCE_32BIT=0;

当我关闭了32位模式后,虚拟环境的python也是32位的架构
参考链接: Anaconda 创建 32位python虚拟环境.

5.打包好的dll动态库还依赖于其他动态库

当准备用ctypes库调用C++程序创建的dll时,会产生如下错误:

python:OSError: [WinError 126] 找不到指定的模块

解决方式就是把所依赖的dll动态库放到python运行目录下:

Python如何动态链接库import python生成动态链接库_Python如何动态链接库import_06


随后就可以在python中调用c++运行的opengl项目了,本人编程初学者,随时记录,希望对大家能有所帮助,下一步计划利用python设计一个opengl的软件出来。