Visual Studio 2010中Python C API的静态链接
Static link to Python C API with Visual Studio 2010
我正在一个现有的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
- 设置预处理器宏Py_NO_ENABLE_SHARED(确保Py_ENABLE_SHARED未设置) 将pyconfig.h拷贝到Python Include目录使用纯Python C API(放弃使用Boost Python,因为它是动态链接到Python的)
在调用Py_Initialize()之前将这些行添加到cpp文件中:
//这些(或它们的子集)是必需的,以便它使用静态链接的python,而不会尝试从默认位置加载python。Py_NoSiteFlag = 1;Py_FrozenFlag = 1;Py_IgnoreEnvironmentFlag = 1;Py_SetPythonHome (" ");Py_SetProgramName (" "),
对于64位编译,需要为每个项目设置Project Settings -> Configuration Properties -> Librarian -> General -> Target Machine。注意,lib文件放在PCbuildamd64(而不是PCbuild)
谢谢
- 用于访问容器<T>数据成员的正确 API
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++MySQL C api用户输入行
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 参考Abaqus C++API静态库来读取ODB文件
- Android NDK调用共享库中静态库的API
- 如何隐藏另一个包含的静态库的API
- 赢得API,每X秒更新一次静态控制
- Qt 5+MSVC2013静态外部库LNK2001 Windows API
- 如果要创建 API,我应该使用静态库还是 DLL?
- 使用LLVM API生成静态代码
- Visual Studio 2010中Python C API的静态链接
- Maya API (c++) -类静态成员变量及其在其他实例中的个性