2

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

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

4

1 回答 1

3

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

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

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

  2. 至少对于 pythoncore 项目,将 Preprocess 定义更改为 Py_NO_ENABLE_SHARED。这告诉项目它将寻找来自静态库的调用。

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

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

  1. 将 Python Include 目录添加到 General->Include Directories 列表中。
  2. 将 Python 库目录添加到 General->Library Directories 列表中。这将是 ..\PCBuild\win32 和 ..\PCBuild\amd64。
  3. 将定义 Py_NO_ENABLE_SHARED 添加到 C/C++ -> Preprocessor 区域。
  4. 对于 Linker->input 添加(对于发行版)python36.lib;shlwapi.lib;version.lib 和(对于调试)python36_d.lib;shlwapi.lib;version.lib。

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

这就是全部。

于 2018-04-23T15:34:03.710 回答