我正在尝试在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