2015-04-21 58 views
7

我試圖在MacOSX Yosemite上安裝PyFTGL。MacOSX + Boost_Python + PyFTGL: - 未找到符號,預計位於:flat命名空間

我使用的python版本是2.7從macports。我已經從指定+ python27的macports安裝了boost。

安裝PyFTGL我從源代碼構建和編輯的setup.py文件:

module_ftgl_libs = [ 
    'GLU', 
    'GL', 
    'freetype', 
    'z', 
    'ftgl', 
    'boost_python', 
    ] 

module_ftgl = Extension(
    'FTGL', 
    module_ftgl_src, 
    include_dirs=module_ftgl_include_dirs, 
    libraries=module_ftgl_libs 
    ) 

到:

module_ftgl_libs = [ 
    'freetype', 
    'z', 
    'ftgl', 
    'boost_python', 
    ] 

module_ftgl = Extension(
    'FTGL', 
    module_ftgl_src, 
    include_dirs=module_ftgl_include_dirs, 
    libraries=module_ftgl_libs, 
    extra_link_args=['-framework', 'OpenGL', '-framework', 'GLUT'] 
    ) 

我然後生成setup.py文件並複製產生FTGL。所以文件到我的python代碼test.py使用FTGL函數相同的文件夾。

我的問題是,當我現在運行我的代碼,我得到以下錯誤:

Traceback (most recent call last): 
    File "test.py", line 29, in <module> 
    import FTGL 
ImportError: dlopen(/Users/james/Desktop/test/FTGL.so, 2): Symbol not found:__ZN5boost6python7objects15function_objectERKNS1_11py_functionERKNSt3__14pairIPNS0_6detail7keywordESA_EE 
    Referenced from: /Users/james/Desktop/test/FTGL.so 
    Expected in: flat namespace 
in /Users/james/Desktop/test/FTGL.so 

我不知道很多有關鏈接,setup.py文件和振奮,我已經花了很長時間研究上谷歌和堆棧溢出,但現在我無法找出問題。

+0

我也有這個問題。你有沒有解決這個問題? – kilojoules

+0

您可以嘗試使用nm在FTGL.so中顯示您的符號表嗎? http://stackoverflow.com/questions/2989233/python-import-error-symbol-not-found-but-the-symbol-sis-s-is-not-present –

回答

1

我可以通過卸載所有Boost庫,然後使用brew install boost155 --with-python --with-mpi --without-single和自制的gcc切換到克服這種錯誤/ G ++ - 5至GCC/G ++ - 4.9

brew edit boost155和替換佈局從taggedsystem如果可能

1

使用c++filt,符號可以被解碼爲:

$ c++filt -n _ZN5boost6python7objects15function_objectERKNS1_11py_functionERKSt4pairIPKNS0_6detail7keywordES9_E 
boost::python::objects::function_object(boost::python::objects::py_function const&, std::pair<boost::python::detail::keyword const*, boost::python::detail::keyword const*> const&) 

由於我有同樣的問題,我想找類似的符號在libboost_python.dylib:

$ nm -gU ~/Downloads/boost_1_60_0/bin.v2/libs/python/build/darwin-4.2.1/debug/libboost_python.dylib | grep function_object 
0000000000027cd0 T __ZN5boost6python7objects15function_objectERKNS1_11py_functionE 
0000000000027c20 T __ZN5boost6python7objects15function_objectERKNS1_11py_functionERKNSt3__14pairIPKNS0_6detail7keywordESA_EE 

一個解碼爲:

boost::python::objects::function_object(boost::python::objects::py_function const&, std::__1::pair<boost::python::detail::keyword const*, boost::python::detail::keyword const*> const&) 

唯一的區別是,提升動態LIB使用std::__1::pair而不是std::pair

也如此處所述:Why can't clang with libc++ in c++0x mode link this boost::program_options example?,libc++libstdc++不兼容。一種選擇是用libstdc++重新編譯提升:

./b2 cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++" python