我无法使用Visual Studio将python.dll构建为静态库(/ MTd)



我正在使用Python的3.6.4源代码版本。我毫不费力地将Visual Studio构建为动态库(/MDd),我可以将Python.dll链接到我自己的代码并验证其操作。

但是当我用(/MTd)构建它(和我的代码)时,当我尝试使用Python程序打开文件时,它很快就会脱轨。调试断言在读取.cpp失败("表达式:_osfile(fh) & FOPEN")。 我相信正在发生的事情是Python.dll与不正确的系统库链接。 我无法弄清楚的是,如何让它与正确的库(静态库)链接。

这就是构建和使用静态嵌入在另一个应用程序中的python需要做的。

构建静态 python 库(例如,python36_d.lib、python36.lib)

  1. 将 python 解决方案 (pcbuild.sln) 中的所有项目转换为静态。 这大约是 40 个项目,因此可能需要一段时间。 这包括将库产品设置为构建为"静态库",并将所有/MD 和/MDd 构建选项设置为/MT 和/MTd。

  2. 至少对于 pythoncore 项目,将预处理定义为Py_NO_ENABLE_SHARED。 这会告诉项目它将查找来自静态库的调用。

  3. 不管怎样,给自己找一个pyconfig.h文件,把它放在Python构建的"包含"区域。 目前尚不清楚此文件是如何从Windows工具构建的,但是似乎可以从其他来源获取一个文件并且工作正常。 人们可能会从您正在构建的代码的预编译版本中获取pyconfig.h。 [顺便说一下,我构建的 Python 是 3.6.5,并且是使用 Windows 2015 更新 3 构建的。

希望这应该使您能够同时构建python36.lib和python36_d.lib。 现在,您需要对应用程序项目进行更改,以使其能够与 python 库链接。 您需要这样做:

  1. 将 Python 包含目录添加到常规>包含目录列表。
  2. 将 Python 库目录添加到常规>库目录列表中。 这将是..\PCBuild\win32 和 ..\PCBuild\amd64.
  3. 将定义Py_NO_ENABLE_SHARED添加到 C/C++ -> 预处理器区域。
  4. 对于链接>输入添加(对于版本)python36.lib;shlwapi.lib;version.lib 和(用于调试)python36_d.lib;shlwapi.lib;版本.lib.

应该就是这样。 它应该运行并工作。 但还有一件事。为了能够运行,可执行文件需要访问python构建的Lib目录。 因此,需要将其副本移动到可执行文件(包含嵌入式 python)所在的任何位置。 或者,您可以将 Lib 区域添加到窗口的执行路径中。 这也应该行得通。

仅此而已。

相关内容

  • 没有找到相关文章

最新更新