[英]Boost Python class export fails to compile with linking error in visual studio 2013
我自己編譯了Boost並用它將以下函數導出到DLL:
#include <boost/python.hpp>
using namespace boost::python;
std::string greet()
{
return "hello, dude !!";
}
BOOST_PYTHON_MODULE(hello)
{
def("greet", greet);
}
在將hello.dll文件重命名為hello.pyd之后,此方法在Python中運行良好。
現在我正在嘗試:
#include <boost/python.hpp>
using namespace boost::python;
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set);
}
錯誤提示:
Error 29 error LNK2019: unresolved external symbol "__declspec(dllimport) void * __cdecl boost::python::objects::find_static_type(void *,struct boost::python::type_info,struct boost::python::type_info)" (__imp_?find_static_type@objects@python@boost@@YAPAXPAXUtype_info@23@1@Z) referenced in function "private: virtual void * __thiscall boost::python::objects::value_holder<struct World>::holds(struct boost::python::type_info,bool)" (?holds@?$value_holder@UWorld@@@objects@python@boost@@EAEPAXUtype_info@34@_N@Z) D:\Code\Python\hello\hello\hello.obj hello
Error 30 error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall boost::python::converter::shared_ptr_deleter::shared_ptr_deleter(struct boost::python::converter::shared_ptr_deleter const &)" (__imp_??0shared_ptr_deleter@converter@python@boost@@QAE@ABU0123@@Z) referenced in function "public: __thiscall boost::shared_ptr<void>::shared_ptr<void><void,struct boost::python::converter::shared_ptr_deleter>(void *,struct boost::python::converter::shared_ptr_deleter)" (??$?0XUshared_ptr_deleter@converter@python@boost@@@?$shared_ptr@X@boost@@QAE@PAXUshared_ptr_deleter@converter@python@1@@Z) D:\Code\Python\hello\hello\hello.obj hello
Error 31 error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall boost::python::objects::class_base::~class_base(void)" (__imp_??1class_base@objects@python@boost@@QAE@XZ) referenced in function __unwindfunclet$??0?$class_@UWorld@@Unot_specified@detail@python@boost@@U2345@U2345@@python@boost@@QAE@PBD0@Z$0 D:\Code\Python\hello\hello\hello.obj hello
Error 32 error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl boost::python::objects::register_dynamic_id_aux(struct boost::python::type_info,struct std::pair<void *,struct boost::python::type_info> (__cdecl*)(void *))" (__imp_?register_dynamic_id_aux@objects@python@boost@@YAXUtype_info@23@P6A?AU?$pair@PAXUtype_info@python@boost@@@std@@PAX@Z@Z) referenced in function "void __cdecl boost::python::objects::register_dynamic_id<struct World>(struct World *)" (??$register_dynamic_id@UWorld@@@objects@python@boost@@YAXPAUWorld@@@Z) D:\Code\Python\hello\hello\hello.obj hello
這是Visual Studio Express2013。我按照此處給出的確切步驟編譯了自己的Boost庫: http : //www.boost.org/doc/libs/1_56_0/doc/html/bbv2/installation.html
我認為我的構建/安裝在全局功能之前很好。 但是,也許與MSVC 2012和13不兼容,因為boost python調試庫名為boost_python-vc120-mt-gd-1_56.lib
。
我得到的答案是: 使用Boost :: Python :: Object會導致鏈接器錯誤
正如bjam使用以下步驟編譯靜態鏈接一樣: http : //www.boost.org/doc/libs/1_56_0/doc/html/bbv2/installation.html
我需要定義BOOST_PYTHON_STATIC_LIB,否則它將假定Boost.python庫的動態鏈接。
編譯的代碼:
#define BOOST_PYTHON_STATIC_LIB
#include <boost/python.hpp>
using namespace boost::python;
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set);
}
使用hello.dll的一種方法是,首先將hello.dll重命名為hello.pyd並將其復制到Python.exe的起始目錄,然后:
Python代碼:
import hello
obj = hello.World()
obj.set("Hello World!")
obj.greet()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.