python - MacOSX + Boost_Python + PyFTGL :- Symbol not found, 预计在:平面命名空间

标签 python macos importerror boost-python ftgl

我正在尝试在 MacOSX Yosemite 上安装 PyFTGL。

我使用的 python 版本是 macports 的 2.7。我已经从指定 +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.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 动态库使用 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

关于python - MacOSX + Boost_Python + PyFTGL :- Symbol not found, 预计在:平面命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777337/

相关文章:

python - 根据一列的值从二维矩阵中提取值

python - 我需要在 Cython 中使用 `nogil`

python - 使用django认证系统

git - git merge 命令后出现不明确的信息消息

python - 相机标定Opencv-Python

macos - 将自释放对象转换为 ARC

ios - OS X 和 iOS 之间 nskeyedarchiver 的兼容性

python - 导入错误。循环引用

python - ImportError:无法从 'is_directory' 导入名称 'PIL._util' (/usr/local/lib/python3.7/dist-packages/PIL/_util.py)

Python3.5 ImportError : libpython3. 5m.so.1.0: 无法打开共享对象文件: No such file or directory