【问题标题】:Static link to Python C API with Visual Studio 2010使用 Visual Studio 2010 到 Python C API 的静态链接
【发布时间】:2015-12-07 03:03:26
【问题描述】:

我正在一个构建 dll 的现有 c++ 项目中工作。 我正在尝试使用 C api 调用 python。我可以使用#include <boost/python.hpp> 或只使用#include <Python.h>,我的代码工作正常。

我已将链接器指向包含 python27.lib 的文件夹(MyProject -> Properties -> ConfigurationProerties -> Linker -> General -> Additional Library Directories),因此我希望它静态链接到 python。

我的问题是,当我使用 Dependency Walker 时,我发现我的 dll 依赖于 python27.dll。

这是我真正想要静态链接到 python 的情况。

我做了很多研究并尝试了各种预处理器指令,但没有运气。感谢您的帮助

【问题讨论】:

  • Python 是否提供静态库?如果没有,那就没办法了
  • 是的,我可以看到 python27.lib 文件并将链接器指向它的目录。
  • 扩展名为 lib 的文件并不代表它是静态 lib 文件
  • 你的意思是 .lib 文件可能只是这个答案stackoverflow.com/questions/1297013/… 中的存根吗?谢谢
  • 是的。如果 DLL 也是用 lib 文件生成的

标签: python c++ visual-studio-2010


【解决方案1】:

解决如下:

正如Matt 所指出的,Python 附带的 lib 文件不是静态库,而只是存根文件。

因此我下载了 python 源并构建了它。要制作我的项目链接,我必须:

  1. 在 python 项目及其所有依赖项中,将 Properties -> General -> ConfigurationType 更改为 Static library。对于可执行文件(make_buildinfo 和 make_versioninfo),需要先构建为可执行文件一次以获取 .exe,然后构建为静态库以获取 .lib 文件。
  2. 这样做:Compiling Python to a static lib and using pythoncore.lib
  3. 设置预处理宏 Py_NO_ENABLE_SHARED(确保 Py_ENABLE_SHARED 未设置)
  4. 将 pyconfig.h 复制到 Python 包含目录中
  5. 使用纯Python C API(放弃使用Boost Python,因为它是动态链接Python)
  6. 在调用 Py_Initialize() 之前将这些行添加到 cpp 文件中:

    // 这些(或它们的子集)是必需的,以便它使用静态链接的 python,并且不会尝试从默认位置加载 python。 Py_NoSiteFlag = 1; Py_FrozenFlag = 1; Py_IgnoreEnvironmentFlag = 1; Py_SetPythonHome(""); Py_SetProgramName("");

  7. 对于 64 位编译,需要为每个项目设置项目设置 -> 配置属性 -> 库管理器 -> 常规 -> 目标机器。请注意,lib 文件放在 PCbuild\amd64(不是 PCbuild)中

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多