簡體   English   中英

MacOSX + Boost_Python + PyFTGL: - 未找到符號,預期在:flat namespace

[英]MacOSX + Boost_Python + PyFTGL :- Symbol not found, expected in: flat namespace

我正在嘗試在MacOSX Yosemite上安裝PyFTGL。

我使用的python版本是來自macports的2.7。 我從macports安裝了boost + python27。

要安裝從源代碼構建的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.so文件復制到與使用FTGL函數的python代碼test.py相同的文件夾中。

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

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文件和提升,我花了很長時間研究Google和Stack Overflow,但現在我無法弄清楚問題。

使用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&)

唯一的區別是boost動態lib使用std::__1::pair而不是std::pair

正如這里也提到的: 為什么不能用c ++ 0x模式中的libc ++來鏈接這個boost :: program_options例子? libc++libstdc++不兼容。 一種選擇是使用libstdc++重新編譯boost:

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

通過卸載所有boost庫然后使用brew install boost155 --with-python --with-mpi --without-single並從homebrew gcc / g ++ - 5切換到gcc / g ++ - 4.9,我能夠克服這個錯誤

如果可能的話,去brew edit boost155並將taggedtagged替換為system

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM