![](/img/trans.png)
[英]Linker Error while building application using Boost Asio in Visual Studio C++ 2008 Express
[英]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 ,它會為您找到缺少的依賴項
盡管這是幾年前發布的一個問題(仍然不容易找到解決方案),但我今天遇到了同樣的問題,經過幾個小時的搜索,我終於找到了一個可行的解決方案。
所以,我做的是復制這個文件,並將其粘貼到.pyd文件夾下,然后我的python可以正確導入我構建的項目。
也許有一些其他解決方案,即構建您的項目不依賴於動態庫,而是使用靜態庫。 有些人說要在VS預處理器中定義BOOST_PYTHON_STATIC_LIB ,那么你的項目將不依賴於動態庫(我是一個新的C ++ er),但要確保你在boost中構建了libboost_python-vcXXX-mt-1_58.dll 。
請確保你有標志-lpython26
(如果你使用的是python2.6),你的文件名應該是hello_ext.pyd
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.