Wziąłem bibliotekę, która jest dystrybuowana jako binarne lib (.a) i nagłówek, napisany na nim kod C++, i chcesz zawinąć wyniki w pytonie moduł.rozszerzenie python c, problemy z dlopen na mac os
Zrobiłem to here.
Problemem jest to, że podczas importowania tego modułu na Mac OSX (Próbowałem 10.5 i 10.6), pojawia się następujący błąd:
dlopen(/Library/Python/2.5/site-packages/dirac.so, 2): Symbol not found: _DisposePtr
Referenced from: /Library/Python/2.5/site-packages/dirac.so
Expected in: dynamic lookup
To wygląda symboli zdefiniowanych w ramach węgla nie oznaczają być właściwie rozwiązany, ale nie jestem pewien, co z tym zrobić. Dostarczam parametr -framework Carbon
do distutil.core.Extension
o wartości extra_link_args
, więc nie jestem pewien, co jeszcze powinienem zrobić.
Każda pomoc będzie mile widziana.
Aktualizacja:
kompilacji linia generowane przez setup.py wygląda następująco:
gcc -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -dynamic -DNDEBUG -g -Os -Wall -Wstrict-prototypes -DMACOSX -I/usr/include/ffi -DENABLE_DTRACE -arch i386 -arch ppc -pipe -Isource -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/numarray/numpy -I/usr/lib/python/2.5/site-packages/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -c source/Dirac_LE.cpp -o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o
Linia łącznik wygląda następująco:
g++ -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch ppc build/temp.macosx-10.5-i386-2.5/diracmodule.o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o -Llibs/MacOSX -lDiracLE -o build/lib.macosx-10.5-i386-2.5/dirac.so -framework Carbon
otool
raportów:
dirac.so:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.5)
Aktualizacja 2: Na MacOS 10.5, modyfikując dlopen flagi z niewykonania zobowiązań RTLD_NOW
do RTLD_LAZY
rozwiązuje problem. Jednak to nie działa w systemie Mac OS 10.6.
Na 10,6 następujący sekwencja pozwala biblioteka działał poprawnie, choć nie jestem pewien, dlaczego:
- python setup.py budować -v
- uruchomić linię łącznikową (wydrukowane na konsolę setup.py) ponownie, ręcznie.
- python setup.py zainstalować
ja wciąż szuka dobrej odpowiedzi, w jaki sposób uzyskać to właściwie działa. Dzięki!
Jaki jest rzeczywisty kompilator polecenie uruchamiane przez setup.py? Usuń katalog 'build' i uruchom' setup.py build -v', aby zobaczyć. Ponadto, co mówi "otool -L" na temat pliku 'dirac.so'? –
@Thomas, Mam zaktualizowane pytanie z tymi informacjami, dzięki. –
To wygląda wtedy dobrze; Argument argumentacyjny znajduje się w wyznaczonym miejscu.Jedyne, co mogę sobie wyobrazić, to że potrzebujesz innego frameworka lub że framework ma wprowadzić zależność shlib i jakoś nie jest (nie wiem, czy struktura Carbon ma to zrobić, czy nie.) –