Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编译、创建共享库和导入c++;Python中的boost模块 P>我看到网络上有大量关于如何编译Python的C++模块的信息。但问题是,实际上任何程序员都有自己的编译方式、自己的标志列表和其他技巧。所以,考虑到各种各样的技巧,我无法决定应该使用哪种方法,而且我还有一些其他问题。这就是我所尝试的: // part of main.cpp file .... BOOST_PYTHON_MODULE( orm ){ class_<ORM>( "ORM", // other code goes here }_Python_C++_Boost_Boost Python - Fatal编程技术网

如何编译、创建共享库和导入c++;Python中的boost模块 P>我看到网络上有大量关于如何编译Python的C++模块的信息。但问题是,实际上任何程序员都有自己的编译方式、自己的标志列表和其他技巧。所以,考虑到各种各样的技巧,我无法决定应该使用哪种方法,而且我还有一些其他问题。这就是我所尝试的: // part of main.cpp file .... BOOST_PYTHON_MODULE( orm ){ class_<ORM>( "ORM", // other code goes here }

如何编译、创建共享库和导入c++;Python中的boost模块 P>我看到网络上有大量关于如何编译Python的C++模块的信息。但问题是,实际上任何程序员都有自己的编译方式、自己的标志列表和其他技巧。所以,考虑到各种各样的技巧,我无法决定应该使用哪种方法,而且我还有一些其他问题。这就是我所尝试的: // part of main.cpp file .... BOOST_PYTHON_MODULE( orm ){ class_<ORM>( "ORM", // other code goes here },python,c++,boost,boost-python,Python,C++,Boost,Boost Python,还是取决于编译过程中创建的对象文件的名称 我的第二个问题是如何编译模块并为Python做准备?现在我这样做: $ g++ -I /usr/include/python2.7 -fpic -c -o main.o main.cpp // part of main.cpp BOOST_PYTHON_MODULE( orm ){ class_<ORM>( "ORM", // other code goes here } 似乎在创建共享库的过程中还需要另外一个步骤,但我

还是取决于编译过程中创建的对象文件的名称

我的第二个问题是如何编译模块并为Python做准备?现在我这样做:

$ g++ -I /usr/include/python2.7 -fpic -c -o main.o main.cpp
// part of main.cpp

BOOST_PYTHON_MODULE( orm ){
    class_<ORM>( "ORM",
    // other code goes here
}
似乎在创建共享库的过程中还需要另外一个步骤,但我不知道该怎么做。顺便问一下,我调用了我的对象文件main.o而不是orm,或者没有给它另一个名称,这样可以吗?对于一些人来说,我的问题是如何编译、构建共享库并将其包含在Python中(我希望我可以在那里使用
import orm

编辑

如果我这样做:

$ g++ -I /usr/include/python2.7 -fpic -c -o main.o main.cpp
// part of main.cpp

BOOST_PYTHON_MODULE( orm ){
    class_<ORM>( "ORM",
    // other code goes here
}
然后,当我尝试在python中导入它时,会出现一个错误:

>>> import orm
...
ImportError: ./orm.so: undefined symbol: _ZNO3.....
那么,我做错了什么?我希望世界上至少有一个人知道答案

编辑

我又做了一次尝试:

$ g++ -fpic -shared -o orm.so main.cpp `pkg-config --cflags --libs python` -I /usr/include/python2.7
当我再次这样做时:

>>> import orm

我仍然收到相同的错误
未定义的符号blabla
。希望有人知道正确操作的神圣知识。

根据要求,举一个小小的工作示例:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <boost/python.hpp>
#include <boost/python/raw_function.hpp>
#pragma GCC diagnostic pop


namespace python = boost::python;

class ORM
{
public:
  void foo(){std::cout << "foo" << std::endl;}
};

BOOST_PYTHON_MODULE(orm)
{
python::class_<ORM>("ORM")
    .def("foo", &ORM::foo)
;
}
运行python模块:

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import orm
>>> o = orm.ORM()
>>> o.foo()
foo
>>> 
如果尝试导入模块返回
未定义符号
错误,则运行时很可能使用的库版本与用于构建python模块的库版本不同。
您可以使用
ldd
打印共享库依赖项以查看是否一切正常,例如:
ldd orm.so
并检查库的路径是否与用于构建模块的路径相同。

信息量很大)几乎与“尝试某事”类似。如何尝试?请你详细说明一下好吗?我应该在我的最后一个命令中添加
ldd
,还是在所有命令之后运行它,或者在什么地方?如果你能提供一个小的工作示例作为答案,那将非常感谢,并且值得+100500的声誉,因为这似乎是许多程序员必须采取的基本步骤。@Jacobian这里是一个基于这个答案的在线示例。
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import orm
>>> o = orm.ORM()
>>> o.foo()
foo
>>>