我正在使用Python的3.6.4源代码版本。我毫不费力地将Visual Studio构建为动态库(/MDd),我可以将Python.dll链接到我自己的代码并验证其操作。
但是当我用(/MTd)构建它(和我的代码)时,当我尝试使用Python程序打开文件时,它很快就会脱轨。调试断言在读取.cpp失败("表达式:_osfile(fh) & FOPEN")。 我相信正在发生的事情是Python.dll与不正确的系统库链接。 我无法弄清楚的是,如何让它与正确的库(静态库)链接。
这就是构建和使用静态嵌入在另一个应用程序中的python需要做的。
构建静态 python 库(例如,python36_d.lib、python36.lib)
-
将 python 解决方案 (pcbuild.sln) 中的所有项目转换为静态。 这大约是 40 个项目,因此可能需要一段时间。 这包括将库产品设置为构建为"静态库",并将所有/MD 和/MDd 构建选项设置为/MT 和/MTd。
-
至少对于 pythoncore 项目,将预处理定义为Py_NO_ENABLE_SHARED。 这会告诉项目它将查找来自静态库的调用。
-
不管怎样,给自己找一个pyconfig.h文件,把它放在Python构建的"包含"区域。 目前尚不清楚此文件是如何从Windows工具构建的,但是似乎可以从其他来源获取一个文件并且工作正常。 人们可能会从您正在构建的代码的预编译版本中获取pyconfig.h。 [顺便说一下,我构建的 Python 是 3.6.5,并且是使用 Windows 2015 更新 3 构建的。
希望这应该使您能够同时构建python36.lib和python36_d.lib。 现在,您需要对应用程序项目进行更改,以使其能够与 python 库链接。 您需要这样做:
- 将 Python 包含目录添加到常规>包含目录列表。
- 将 Python 库目录添加到常规>库目录列表中。 这将是..\PCBuild\win32 和 ..\PCBuild\amd64.
- 将定义Py_NO_ENABLE_SHARED添加到 C/C++ -> 预处理器区域。
- 对于链接>输入添加(对于版本)python36.lib;shlwapi.lib;version.lib 和(用于调试)python36_d.lib;shlwapi.lib;版本.lib.
应该就是这样。 它应该运行并工作。 但还有一件事。为了能够运行,可执行文件需要访问python构建的Lib目录。 因此,需要将其副本移动到可执行文件(包含嵌入式 python)所在的任何位置。 或者,您可以将 Lib 区域添加到窗口的执行路径中。 这也应该行得通。
仅此而已。