链接错误Boost.使用stlport作为标准库的Python

Linking error Boost.Python with stlport as stdlib

本文关键字:标准 Python 错误 Boost 使用 stlport 链接      更新时间:2023-10-16

我正在尝试为python创建c++扩展。我的c++代码依赖于STLPort 5.1.0。我已经编译了boost。使用stdlib=stlport的Python。这发生在我的编译器,这是Microsoft Visual Studio 2005。

但是当我试图编译我的测试项目时,我一直得到以下链接错误。

stdafx.h包含:

// 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::variate_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)
    ;
}

最重要的是,会导致以下链接错误:错误2错误LNK2019:无法解析的外部符号"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)在函数中引用"类boost::python::api::object __cdecl boost::python::detail::make_function_aux,类stlpd_std::allocator>(__thiscall World::*)(void),结构体boost::python::default_call_policies,结构体boost::mpl::vector2,类stlpd_std::allocator>,结构体World &>,结构体boost::mpl::int_<0>>(类stlpd_std::basic_string,类stlpd_std::basic_string)"stlpd_std::allocator> (__thiscall World::*)(void),struct boost::python::default_call_policies const &,struct boost::mpl::vector2,类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_@ 0 a@@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_@美元0 a@@mpl@2@@z) TestProject。obj

如果我没记错的话,Boost Python库要求您提前构建它,以便使用它的项目可以链接到它。你已经这么做了吗?