2015-04-21 21 views
7

Sto tentando di installare PyFTGL su MacOSX Yosemite.MacOSX + Boost_Python + PyFTGL: - Simbolo non trovato, previsto in: spazio dei nomi piatto

La versione python che sto usando è 2.7 da macports. Ho installato boost da macports specificando + python27.

Per installare PyFTGL Ho costruito dalla sorgente e modificato il file setup.py da:

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 
    ) 

a:

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

Ho poi creare il file setup.py e copiare il FTGL risultante. quindi file nella stessa cartella del mio codice python test.py che usa le funzioni FTGL.

mio problema è quando ora corro il mio codice ottengo il seguente errore:

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 

Non so molto sul collegamento, file setup.py e Boost e ho trascorso molto tempo alla ricerca su sia Google che Stack Overflow ma ora non riesco a capire il problema.

+0

Ho anche questo problema. Hai mai risolto questo? – kilojoules

+0

Puoi provare a usare nm per visualizzare la tabella dei simboli in FTGL.so? http://stackoverflow.com/questions/2989233/python-import-error-symbol-not-found-but-the-symbol-sis-s-is-not-present –

risposta

1

sono stato in grado di superare questo errore disinstallando tutte le librerie Boost quindi utilizzando brew install boost155 --with-python --with-mpi --without-single e il passaggio da gcc homebrew/g ++ - 5 a gcc/g ++ - 4.9

andare a brew edit boost155 e sostituire il layout tagged-system se possibile

1

Utilizzando c++filt, il simbolo può essere decodificato come:

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

Dal momento che ho lo stesso problema, ho cercato i simboli simili in 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 

Uno dei quali decodifica come:

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

L'unica differenza è che il lib dinamica spinta utilizza std::__1::pair invece di std::pair.

Come indicato qui: Why can't clang with libc++ in c++0x mode link this boost::program_options example?, libc++ e libstdc++ non sono compatibili. Un'opzione è ricompilare boost con libstdc++:

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