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

I cannot build python.dll as a static library (/MTd) using Visual Studio

我正在使用 Python 的 3.6.4 源版本。我可以使用 Visual Studio 作为动态库 (/MDd) 构建它,我可以 link 将 Python .dll 添加到我自己的代码中并验证其操作。

但是,当我使用 (/MTd) 构建它(和我的代码)时,当我尝试使用 Python 程序打开文件时,它很快就会跑完 rails。 read.cpp ("Expression: _osfile(fh) & FOPEN") 中的调试断言失败。我认为正在发生的事情是 Python .dll 正在 link 使用不正确的系统库。我想不通的是如何使用正确的(静态库)link。

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

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

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

  2. 至少 python 核心项目将预处理定义更改为 Py_NO_ENABLE_SHARED。这告诉项目它将寻找来自静态库的调用。

  3. 不择手段,为自己找到一个 pyconfig.h 文件并将其放入 Python 构建的包含区域。目前还不清楚这个文件是如何从 Windows 工具构建的,但似乎可以从其他来源获取一个并且它工作正常。人们可能会从您正在构建的代码的预编译版本中获取 pyconfig.h。 [顺便说一句,我构建的 Python 是 3.6.5,是用 Windows 2015 更新 3 构建的。]

希望这能让您同时构建 python36.lib 和 python36_d.lib。现在您需要更改您的应用程序项目,以使用 python 库启用它 link。您需要这样做:

  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;version.lib.

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

这就是全部。