MacOSX Boost_Python PyFTGL: – 未找到符号,预期在:flat namespace

前端之家收集整理的这篇文章主要介绍了MacOSX Boost_Python PyFTGL: – 未找到符号,预期在: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',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文件和boost,我花了很长时间研究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.

同样在这里提到:Why can’t clang with libc++ in c++0x mode link this boost::program_options example?,libc和libstdc不兼容.一种选择是使用libstdc重新编译boost:

./b2 cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++" python
原文链接:https://www.f2er.com/c/118594.html

猜你在找的C&C++相关文章