【发布时间】:2014-07-28 09:44:06
【问题描述】:
我在从我的 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,它似乎工作正常。非常感谢任何建议!
【问题讨论】:
标签: python c++ build linker boost-python