Linking error Boost.Python with stlport as stdlib
I'm trying to create C++ extensions for python. My C++ code relies on STLPort 5.1.0. I've compiled boost.python with stdlib=stlport. This occurs in my compiler which is Microsoft Visual Studio 2005.
But I keep getting the following linking error when I attempt to compile my test project.
stdafx.h contains:
// STL
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
#include <iostream>
using namespace std;
// Boost
#include <boost/shared_ptr.hpp>
#include <boost/algorithm/string.hpp>
#define BOOST_PYTHON_STATIC_LIB
TestProject.cpp: #include "stdafx.h" #include "TestProject.h"
/**Python Link Begin**/
#include <boost/python.hpp>
#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>
using namespace boost::python;
boost::mt19937 gen;
struct World
{
std::string msg;
double mypi;
World(std::string msg): msg(msg) {
gen.seed(std::time(0));
} // added constructor
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
double get() const { return mypi; }
void setter(double mypi) { this->mypi = mypi; }
double getgaussrand() {
boost::normal_distribution<> nd(0.0, 1.0);
boost::v开发者_开发百科ariate_generator<boost::mt19937&, boost::normal_distribution<> > var_nor(gen, nd);
return var_nor();
}
};
BOOST_PYTHON_MODULE(TestProject)
{
class_<World>("World", init<std::string>())
.def("greet", &World::greet)
.def("set", &World::set)
.def("getgaussrand", &World::getgaussrand)
.def_readonly("msg", &World::msg)
.def_readwrite("mypi", &World::mypi)
.add_property("rovalue", &World::get)
.add_property("value", &World::get, &World::setter)
;
}
Most Importantly, the following linking error results: Error 2 error LNK2019: unresolved external symbol "class boost::python::api::object __cdecl boost::python::objects::function_object(struct boost::python::objects::py_function const &,struct stlpd_std::pair const &)" (?function_object@objects@python@boost@@YA?AVobject@api@23@ABUpy_function@123@ABU?$pair@PBUkeyword@detail@python@boost@@PBU1234@@stlpd_std@@@Z) referenced in function "class boost::python::api::object __cdecl boost::python::detail::make_function_aux,class stlpd_std::allocator > (__thiscall World::*)(void),struct boost::python::default_call_policies,struct boost::mpl::vector2,class stlpd_std::allocator >,struct World &>,struct boost::mpl::int_<0> >(class stlpd_std::basic_string,class stlpd_std::allocator > (__thiscall World::*)(void),struct boost::python::default_call_policies const &,struct boost::mpl::vector2,class stlpd_std::allocator >,struct World &> const &,struct stlpd_std::pair const &,struct boost::mpl::int_<0>)" (??$make_function_aux@P8World@@AE?AV?$basic_string@DV?$char_traits@D@stlpd_std@@V?$allocator@D@2@@stlpd_std@@XZUdefault_call_policies@python@boost@@U?$vector2@V?$basic_string@DV?$char_traits@D@stlpd_std@@V?$allocator@D@2@@stlpd_std@@AAUWorld@@@mpl@6@U?$int_@$0A@@86@@detail@python@boost@@YA?AVobject@api@12@P8World@@AE?AV?$basic_string@DV?$char_traits@D@stlpd_std@@V?$allocator@D@2@@stlpd_std@@XZABUdefault_call_policies@12@ABU?$vector2@V?$basic_string@DV?$char_traits@D@stlpd_std@@V?$allocator@D@2@@stlpd_std@@AAUWorld@@@mpl@2@ABU?$pair@PBUkeyword@detail@python@boost@@PBU1234@@7@U?$int_@$0A@@mpl@2@@Z) TestProject.obj
If I remember correctly, the Boost Python library requires you to build it ahead of time so that your projects that use it can link against it. Have you done this already?
精彩评论