Visual Studio 2010中Python C API的静态链接

Static link to Python C API with Visual Studio 2010

本文关键字:API 静态 链接 Python Studio 2010 Visual      更新时间:2023-10-16

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

我将链接器指向包含python27的文件夹。lib (MyProject -> Properties -> configurationproperties -> Linker -> General -> Additional Library Directories),所以我希望它能静态链接到python。

我的问题是,当我使用Dependency Walker查看时,我看到我的dll依赖于python27.dll。

在这种情况下,我真的想静态链接到python。

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

解析如下:

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

因此,我下载了python源代码并构建了它。要使我的项目链接,我必须:
    在python项目及其所有依赖项中,将Properties -> General -> ConfigurationType更改为Static library。对于可执行文件(make_buildinfo和make_versioninfo),需要先作为可执行文件构建一次以获得。exe,然后作为静态库构建以获得。lib文件。这样做:将Python编译为静态库并使用pythoncore.lib
  1. 设置预处理器宏Py_NO_ENABLE_SHARED(确保Py_ENABLE_SHARED未设置)
  2. 将pyconfig.h拷贝到Python Include目录使用纯Python C API(放弃使用Boost Python,因为它是动态链接到Python的)
  3. 在调用Py_Initialize()之前将这些行添加到cpp文件中:

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

  4. 对于64位编译,需要为每个项目设置Project Settings -> Configuration Properties -> Librarian -> General -> Target Machine。注意,lib文件放在PCbuildamd64(而不是PCbuild)

谢谢