问题 使用Visual Studio 2008构建boost python示例


我正在使用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加载失败

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


2728
2018-01-07 07:40


起源

对于那些有兴趣用makefile(和gcc)构建这样一个项目的人,请参阅 stackoverflow.com/questions/2003506/... - rafak


答案:


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

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

$(OutDir)\$(ProjectName).pyd

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

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

#define BOOST_PYTHON_STATIC_LIB

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


10
2018-01-07 12:08





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

或者使用 依赖沃克 这将找到你缺少的依赖项


5
2018-01-08 21:32





虽然这是几年前发布的问题(仍然不容易找到解决方案),但我今天遇到了同样的问题,经过几个小时的搜索,最后我找到了一个可行的解决方案。

  • 原因就像@AndiDog注意到的那样简单 .pyd 你建立的文件取决于其他一些 .DLL;
  • 在我的情况下,它是 boost_python-VC120-MT-1_58.dll 在文件夹下 [C ++ boost文件夹] / stage / lib /
  • 所以,我所做的就是复制这个文件,并将其粘贴到 .pyd 文件夹,然后我的python可以正确导入我构建的项目。

  • 也许有一些其他解决方案,即构建您的项目不依赖于动态库,而是使用静态库。一些消息来源说要定义 BOOST_PYTHON_STATIC_LIB 在VS预处理器中,那么你的项目将不依赖于动态库(我是一个新的C ++ er),但要确保你有构建 libboost_python-vcXXX-MT-1_58.dll 在提升。

  • 定义预处理器,路由是:C / C ++ - >预处理器 - >预处理器定义 - >编辑BOOST_PYTHON_STATIC_LIB

1
2017-07-02 05:13





请确保你有旗帜 -lpython26 (如果你使用python2.6)和文件名应该是 hello_ext.pyd 在你的情况下。


0
2018-01-07 07:47