2010-05-07 13 views
9

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:

  1. python setup.py budować -v
  2. uruchomić linię łącznikową (wydrukowane na konsolę setup.py) ponownie, ręcznie.
  3. python setup.py zainstalować

ja wciąż szuka dobrej odpowiedzi, w jaki sposób uzyskać to właściwie działa. Dzięki!

+1

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'? –

+0

@Thomas, Mam zaktualizowane pytanie z tymi informacjami, dzięki. –

+0

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.) –

Odpowiedz

4

Skopiesz się, gdy zobaczysz odpowiedź na to pytanie! Spróbuj zmienić to:

link_args = ['-framework Carbon'] if platform == 'Darwin' else [] 

do tego:

link_args = ['-framework', 'Carbon'] if platform == 'Darwin' else [] 

Raz zrobiłem tę zmianę udało mi się zrobić czystą kompilację i zaimportować moduł od razu :)

+0

Niewiarygodne. Dzięki! –

Powiązane problemy