簡體   English   中英

使用Visual Studio 2008構建boost python示例

[英]building boost python examples using Visual Studio 2008

我正在使用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文件?

首先,確保您只嘗試從Python導入發布版本; 導入調試版本將失敗,因為運行時庫版本不匹配。 我還更改了我的項目屬性,以便發布版本輸出.pyd文件:

屬性>>鏈接器>>輸出:

$(OutDir)\$(ProjectName).pyd

(我還創建了一個后期構建操作來從python運行單元測試)

接下來,確保在stdafx.h文件中定義以下內容:

#define BOOST_PYTHON_STATIC_LIB

最后,如果您安裝了多個python版本,請確保導入正確版本的python.h(在工具>>選項>>項目和解決方案>> VC ++目錄>>包含文件中)。

錯誤ImportError:Dll加載失敗通常意味着您的.pyd模塊依賴於無法找到的其他DLL - 通常是msvc * .dll 您可能想嘗試在記事本中打開.pyd文件並搜索“.dll”。 然后檢查目錄或PATH中是否存在所有DLL依賴項。

或者使用Dependency Walker ,它會為您找到缺少的依賴項

盡管這是幾年前發布的一個問題(仍然不容易找到解決方案),但我今天遇到了同樣的問題,經過幾個小時的搜索,我終於找到了一個可行的解決方案。

  • 原因就像@AndiDog注意到的那樣簡單,你構建的.pyd文件依賴於其他一些.dll ;
  • 就我而言,它是文件夾[C ++ boost folder] / stage / lib /下的boost_python-vc120-mt-1_58.dll
  • 所以,我做的是復制這個文件,並將其粘貼到.pyd文件夾下,然后我的python可以正確導入我構建的項目。

  • 也許有一些其他解決方案,即構建您的項目不依賴於動態庫,而是使用靜態庫。 有些人說要在VS預處理器中定義BOOST_PYTHON_STATIC_LIB ,那么你的項目將不依賴於動態庫(我是一個新的C ++ er),但要確保你在boost中構建了libboost_python-vcXXX-mt-1_58.dll

  • 定義預處理器,路由是: C / C ++ - >預處理器 - >預處理器定義 - >編輯BOOST_PYTHON_STATIC_LIB

請確保你有標志-lpython26 (如果你使用的是python2.6),你的文件名應該是hello_ext.pyd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM