我无法从Boost Python项目构建共享库。由于某种原因,最终的共享库几乎是空的,并且不包含我的任何包装函数。我设法在计算机上运行了“ Hello World”示例,因此,我很确定自己已经正确安装和配置了Boost。

这是模块定义(在FM.h头文件中):

/* Python Wrapper using Boost.python */
#include <boost/python.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(fm_index)
{
    class_<FM>("FM", init<>())
            .def(init<uint8_t* , uint32_t, uint32_t>())
            .def("save", &FM::save)
            .def("count", &FM::count)
            .def("locate", &FM::locate)
            .def("extract", &FM::extract)
            .def("load", &FM::load, return_value_policy<manage_new_object>())
            .staticmethod("load")
    ;
}


这是我的MakeFile中的构建定义:

CCP=g++
CFLAGS=-W -Wall -O3 -fPIC

INCCDS=./libcds/includes/
INCDIVSUF=./libdivsufsort/include/

BOOST_INC=/home/adevabhaktuni/boost_1_52_0/
BOOST_LIB=/home/adevabhaktuni/boost_1_52_0/stage/lib/

PYTHON_VERSION=2.6
PYTHON_INCLUDE=/usr/include/python$(PYTHON_VERSION)

FM.o: FM.cpp FM.h
    $(CCP) -I $(INCCDS) -I $(INCDIVSUF) -I $(BOOST_INC) -I $(PYTHON_INCLUDE) -c $(CFLAGS) FM.cpp -o FM.o

fm_index.so: FM.o ./libcds/lib/libcds.a ./libdivsufsort/lib/libdivsufsort.a
    $(CCP) -shared -W1,soname,fm_index.so -L $(BOOST_LIB) -lboost_python -lpython$(PYTHON_VERSION) FM.o ./libcds/lib/libcds.a ./libdivsufsort/lib/libdivsufsort.a -o fm_index.so


目标文件FM.o约为206 kB,当我在该文件上运行nm -u时,我看到了我期望看到的所有功能。但是,共享库fm_index.so的大小仅为5 kB,几乎完全为空!

nm -u fm_index.so

fm_index.so:
0000000000200540 a _DYNAMIC
0000000000200728 a _GLOBAL_OFFSET_TABLE_
             w _Jv_RegisterClasses
0000000000200518 d __CTOR_END__
0000000000200510 d __CTOR_LIST__
0000000000200528 d __DTOR_END__
0000000000200520 d __DTOR_LIST__
0000000000000508 r __FRAME_END__
0000000000200530 d __JCR_END__
0000000000200530 d __JCR_LIST__
0000000000200748 A __bss_start
             w __cxa_finalize@@GLIBC_2.2.5
00000000000004c0 t __do_global_ctors_aux
0000000000000410 t __do_global_dtors_aux
0000000000200538 d __dso_handle
             w __gmon_start__
0000000000200748 A _edata
0000000000200758 A _end
00000000000004f8 T _fini
00000000000003b8 T _init
00000000000003f0 t call_gmon_start
0000000000200750 b completed.6145
0000000000200748 b dtor_idx.6147
0000000000000490 t frame_dummy


当我尝试在Python中导入fm_index模块时,出现以下错误:

ImportError: dynamic module does not define init function (initfm_index)


有人知道这是怎么回事吗?我没有使用bjam,因为我不知道如何包括fm_index模块依赖的libcds.a和libdivsufsort.a库。但是,我在“ Hello World”项目中使用了与上面类似的MakeFile,它似乎可以正常工作。任何建议都非常感谢!

最佳答案

您永远不会定义要使用Boost.Python包装的函数?

也许您应该看一下Boost.Python文档中的第一个hello world示例:

Exposing Classes

10-04 10:52
查看更多