2011-04-27 154 views
3

當試圖導入使用boost python編譯的擴展時,我得到一個未定義的符號錯誤,並且該符號應該包含在boost庫中。未定義的boost python符號:boost :: python :: detail :: init_module

我使用Boost 1.46.1,Python 3.1.2和GCC 4.4.5。

我已經使用內置升壓:

$ ./bootstrap.sh --with-python-version=3.1 
$ sudo ./bjam -j4 install 

然後我整理了以下瑣碎升壓Python庫:使用命令

#include <boost/python.hpp> 

struct mystruct { 
    int i; 
}; 

BOOST_PYTHON_MODULE(test) { 
    using namespace boost::python; 
    class_<mystruct>("Mystruct") 
     .def_readwrite("i", &mystruct::i) 
     ; 
} 

$ g++ -shared question.cpp -I/usr/include/python3.1 -lboost_python3 -lpython3.1 -otest.so 

其成功沒有錯誤。

然後我嘗試在Python運行它,但它似乎無法找到的init_module函數boost蟒蛇應該提供:

$ python3 
Python 3.1.2 (release31-maint, Sep 17 2010, 20:34:23) 
[GCC 4.4.5] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import test 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: ./test.so: undefined symbol: _ZN5boost6python6detail11init_moduleEPKcPFvvE 

LDD報告如下:

$ ldd -r test.so 
    linux-gate.so.1 => (0x00ab3000) 
    libboost_python3.so.1.46.1 => /usr/local/lib/libboost_python3.so.1.46.1 (0x002fe000) 
    libpython3.1.so.1.0 => /usr/lib/libpython3.1.so.1.0 (0x005dc000) 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x001f8000) 
    libm.so.6 => /lib/libm.so.6 (0x00110000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00424000) 
    libc.so.6 => /lib/libc.so.6 (0x00886000) 
    libutil.so.1 => /lib/libutil.so.1 (0x00e13000) 
    libpthread.so.0 => /lib/libpthread.so.0 (0x00136000) 
    libdl.so.2 => /lib/libdl.so.2 (0x00349000) 
    librt.so.1 => /lib/librt.so.1 (0x00150000) 
    libssl.so.0.9.8 => /lib/libssl.so.0.9.8 (0x00553000) 
    libcrypto.so.0.9.8 => /lib/libcrypto.so.0.9.8 (0x00ab4000) 
    libffi.so.5 => /usr/lib/libffi.so.5 (0x00159000) 
    libz.so.1 => /lib/libz.so.1 (0x00160000) 
    libexpat.so.1 => /lib/libexpat.so.1 (0x00175000) 
    /lib/ld-linux.so.2 (0x00495000) 
undefined symbol: _ZN5boost6python6detail11init_moduleEPKcPFvvE (./test.so) 

編輯:

nm確認/usr/local/lib/libboost_python3.so.1.46.1確實包括init_module,但錯誤仍然存​​在:

$ nm /usr/local/lib/libboost_python3.so.1.46.1 | c++filt | grep init_module 
00031a00 T boost::python::detail::init_module(PyModuleDef&, void (*)()) 

回答

3

未定義的符號是

boost::python::detail::init_module(char const*, void (*)()) 

boost::python::detail::init_module(PyModuleDef&, void (*)()) 

http://www.boost.org/doc/libs/1_46_1/boost/python/module_init.hpp我看到方法簽名已經在Python變爲後者3

你應該讓當處理boost python頭文件時,確定PY_VERSION_HEX設置正確。

在我的系統上,我看到這是例如定義在/usr/include/python3.1/patchlevel.h(但我必須先安裝python 3.1 開發包)

+0

非常感謝。奇怪的是,提升python 1.45.0似乎沒有Python開發包的工作。 – vsekhar 2011-04-29 13:35:18

+0

但它確實看起來是PyModuleDef&連接器抱怨沒有。 @vsekhar,所以你通過安裝python-dev來解決這個問題? – murrayc 2015-07-09 07:35:51

相關問題