#c #python #boost #boost-python #stlport
#c #python #boost #boost-python #stlport
Вопрос:
Я пытаюсь создать расширения C для python. Мой код на C основан на STLPort 5.1.0. Я скомпилировал boost.python с помощью stdlib = stlport. Это происходит в моем компиляторе, которым является 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:
#включить «stdafx.h»
#включить «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::mt19937amp;, boost::normal_distribution<> > var_nor(gen, nd);
return var_nor();
}
};
BOOST_PYTHON_MODULE(TestProject)
{
class_<World>("World", init<std::string>())
.def("greet", amp;World::greet)
.def("set", amp;World::set)
.def("getgaussrand", amp;World::getgaussrand)
.def_readonly("msg", amp;World::msg)
.def_readwrite("mypi", amp;World::mypi)
.add_property("rovalue", amp;World::get)
.add_property("value", amp;World::get, amp;World::setter)
;
}
Самое главное, что приводит к следующей ошибке связывания:
Ошибка 2 ошибка LNK2019: неразрешенный внешний символ «повышение класса::python::api::object __cdecl boost::python::objects::function_object(усиление структуры::python::objects::py_function const amp;,struct stlpd_std::pair const amp;)» (?function_object@objects@python@boost@@YA?AVobject@api@23@ABUpy_function@123@ABU?$pair@PBUkeyword@detail@python@boost@@PBU1234@@stlpd_std@@@Z), на который ссылается функция «повышение класса::python::api::объект __cdecl boost::python::detail::make_function_aux,класс stlpd_std::распределитель > (__этот вызов World::*)(void),struct boost::python::default_call_policies,struct boost::mpl::vector2, класс stlpd_std::распределитель >,struct World amp;>,struct boost::mpl::int_<0> >(класс stlpd_std::basic_string, класс stlpd_std::распределитель > (__этот вызываемый мир::*)(void),struct boost::python: :default_call_policies const amp;,struct boost::mpl::vector2, класс stlpd_std::распределитель >,struct World amp;> const amp;,struct stlpd_std::pair const amp;,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
Комментарии:
1. Я понятия не имею об ошибке, но… Статическое связывание BP обычно не рекомендуется. Расширения BP имеют некоторые кварки при статической привязке к BP.
2. Вы когда-нибудь добирались до сути этого? Я сталкиваюсь с аналогичной проблемой.
Ответ №1:
Если я правильно помню, библиотека Boost Python требует, чтобы вы создали ее заранее, чтобы ваши проекты, которые ее используют, могли ссылаться на нее. Вы это уже сделали?
Комментарии:
1. Да, я собрал python. lib-файлы типа ‘boost_python-vc80-mt-gdp-1_46_1.lib’.