2015-04-21 6 views
7

Próbuję zainstalować PyFTGL na MacOSX Yosemite.MacOSX + Boost_Python + PyFTGL: - Nie znaleziono symbolu, oczekiwano w: płaska przestrzeń nazw

Używana wersja pythona to 2.7 od wersji Macport. Zainstalowałem boost z makportów podając + python27.

Aby zainstalować PyFTGL Zbudowałem od źródła i edytować plik setup.py od:

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 
    ) 

do:

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'] 
    ) 

I następnie zbudować plik setup.py i skopiuj wynikowy FTGL. więc plik do tego samego folderu, co mój kod Pythona test.py, który używa funkcji FTGL.

Moim problemem jest to, kiedy teraz uruchomić mojego kodu pojawia się następujący błąd:

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 

nie wiem zbyt wiele o łączenie, plików setup.py i zwiększyć i spędziłem dużo czasu na badania zarówno Google, jak i Stack Overflow, ale teraz nie mogę zrozumieć problemu.

+0

Mam również ten problem. Czy kiedykolwiek rozwiązałeś to? – kilojoules

+0

Czy możesz spróbować użyć nm, aby wyświetlić tabelę symboli w FTGL.so? http://stackoverflow.com/questions/2989233/python-import-error-symbol-not-found-but-the-symbol-sis-s-is-not-present –

Odpowiedz

1

udało mi się przezwyciężyć ten problem przez odinstalowanie wszystkich bibliotek Boost następnie używając brew install boost155 --with-python --with-mpi --without-single i przełączania z homebrew gcc/g ++ - 5 do gcc/g ++ - 4.9

iść do brew edit boost155 i zastąpić układ z tagged do system jeżeli możliwe

1

Korzystanie c++filt symbol mogą być dekodowane jako:

$ 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&) 

Ponieważ mam ten sam problem, szukałam podobnych symboli w libboost_python.dylib:

których
$ 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 

Jeden dekoduje jako:

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

Jedyną różnicą jest to, że impuls dynamiczny lib wykorzystuje std::__1::pair zamiast std::pair.

Jak również wspomniano tutaj: Why can't clang with libc++ in c++0x mode link this boost::program_options example?, libc++ i libstdc++ są niezgodne. Jedną opcją jest rekompilacja doładowania z libstdc++:

./b2 cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++" python 
Powiązane problemy