使用 Visual Studio 2008 构建 boost python 示例

Posted

技术标签:

【中文标题】使用 Visual Studio 2008 构建 boost python 示例【英文标题】:building boost python examples using Visual Studio 2008 【发布时间】:2010-01-07 07:40:04 【问题描述】:

我正在使用 Boost Python 库为我的 C++ 代码创建 python 扩展。我希望能够从 python 调用下面显示的 C++ 代码中的 'greet' 函数:

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>

char const* greet()

   return "hello, world";


BOOST_PYTHON_MODULE(hello_ext)

    using namespace boost::python;
    def("greet", greet);

还有python代码:

import hello_ext
print hello_ext.greet() 

我已经设法使用 bjam 做到了这一点(生成了 hello_ext.pyd 并且效果很好),但现在我想使用 Visual Studio 2008 构建它。一个 hello.dll 被构建(但没有 hello_ext. dll 也没有任何 .pyd)。调用我的 python 代码后出现错误:

ImportError: 没有名为 hello_ext 的模块。

将 hello.dll 重命名为 hello.pyd 或 hello_ext.pyd 后,我得到另一个 ImportError: Dll load failed

如何使用 VS 2008 构建正确的 .pyd 文件?

【问题讨论】:

对于那些有兴趣使用makefile(和gcc)构建这样一个项目的人,请参阅***.com/questions/2003506/… 【参考方案1】:

首先,确保您只尝试从 Python 导入发布版本;导入调试版本将失败,因为运行时库版本不匹配。我还更改了我的项目属性,以便发布版本输出一个 .pyd 文件:

属性>>链接器>>输出:

$(OutDir)\$(ProjectName).pyd

(我还创建了一个构建后操作来从 python 运行单元测试)

接下来,确保在 stdafx.h 文件中定义以下内容:

#define BOOST_PYTHON_STATIC_LIB

最后,如果您安装了多个 python 版本,请确保您正在导入正确版本的 python.h(在工具 >> 选项 >> 项目和解决方案 >> VC++ 目录 >> 包含文件中)。

【讨论】:

【参考方案2】:

错误 ImportError: Dll load failed 通常意味着您的 .pyd 模块依赖于无法找到的其他 DLL - 通常是 msvc*.dll。您可能想尝试在记事本中打开 .pyd 文件并搜索“.dll”。然后检查您的目录或 PATH 中是否存在所有 DLL 依赖项。

或者使用Dependency Walker,它会为你找到缺失的依赖项

【讨论】:

【参考方案3】:

尽管这是几年前提出的问题(仍然不容易找到解决方案),但我今天遇到了同样的问题,经过几个小时的搜索,终于找到了一个可行的解决方案。

原因和@AndiDog 注意到的一样简单,您构建的.pyd 文件依赖于其他一些.dll; 在我的例子中,它是 boost_python-vc120-mt-1_58.dll 文件夹下的 [C++ boost 文件夹]/stage/lib/

那么,我要做的就是复制这个文件,粘贴到.pyd文件夹下,然后我的python就可以正常导入我构建的项目了。

也许还有一些其他的解决方案,那就是构建你的项目不依赖于动态库,而是使用静态库。一些消息来源说要在 VS Preprocessor 中定义 BOOST_PYTHON_STATIC_LIB,那么你的项目将不依赖于动态库(我是一个新的 C++er),但请确保你已经构建了 libboost_python- vcXXX-mt-1_58.dll 在 boost.

定义Preprocessor,路径为:C/C++->Preprocessor->Preprocessor Definitions->edit BOOST_PYTHON_STATIC_LIB

【讨论】:

【参考方案4】:

请确保您有标志-lpython26(如果您使用的是python2.6)并且文件名应为hello_ext.pyd

【讨论】:

以上是关于使用 Visual Studio 2008 构建 boost python 示例的主要内容,如果未能解决你的问题,请参考以下文章

使用 Visual Studio 2008 构建 boost python 示例

图表构建不正确(MS Visual Studio Reports 2008)

如何在 Access2007 中使用基于 Visual Studio (2008/2010) 构建的 XML Web 服务

visual studio 2008 - 构建问题

无法在 Visual Studio 2008 中构建 Boost.python。编译出错

使用 Visual Studio 2008 构建 OpenCV 应用程序并从另一台计算机运行它