【问题标题】:Shared library from Boost python build does not contain any functions来自 Boost python 构建的共享库不包含任何函数
【发布时间】: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


    【解决方案1】:

    你从来没有定义你想用 Boost.Python 包装的函数?

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

    Exposing Classes

    【讨论】:

      【解决方案2】:

      链接器命令行看起来不正确,因为它以错误的顺序列出对象和库。尝试将其更改为:

      $(CCP) -shared -o $@ -W1,soname,${@F} -L$(BOOST_LIB) FM.o ./libcds/lib/libcds.a ./libdivsufsort/lib/libdivsufsort.a -lboost_python -lpython$(PYTHON_VERSION) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多