Sto provando a creare un'estensione Python su MacOSX 10.6 e collegarlo a più framework (solo i386). Ho creato un file setup.py, usando distutils e l'oggetto Extension.Costruire un modulo python e collegarlo a un framework MacOSX
ho per collegare contro i miei quadri, i miei LDFLAGS env var dovrebbe essere simile:
LDFLAGS = -lc -arch i386 -framework fwk1 -framework fwk2
Come non ho trovato una qualsiasi parola chiave 'quadro' nella documentazione del modulo di estensione, ho usato la extra_link_args Parola chiave invece.
Extension('test',
define_macros = [('MAJOR_VERSION', '1'), ,('MINOR_VERSION', '0')],
include_dirs = ['/usr/local/include', 'include/', 'include/vitale'],
extra_link_args = ['-arch i386',
'-framework fwk1',
'-framework fwk2'],
sources = "testmodule.cpp",
language = 'c++')
Tutto sta compilando e collegando bene. Se rimuovo la linea -framework da extra_link_args, il mio linker fallisce, come previsto. Ecco le ultime due righe prodotte da un accumulo python setup.py:
/usr/bin/g++-4.2 -arch x86_64 -arch i386 -isysroot/
-L/opt/local/lib -arch x86_64 -arch i386 -bundle
-undefined dynamic_lookup build/temp.macosx-10.6-intel-2.6/testmodule.o
-o build/lib.macosx-10.6-intel-2.6/test.so
-arch i386 -framework fwk1 -framework fwk2
Purtroppo, la .so che ho appena prodotto non è in grado di trovare diversi simboli forniti da questo quadro. Ho provato a controllare il framework collegato con otool. Nessuno di loro appare.
$ otool -L test.so
test.so:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)
V'è l'uscita di corsa otool su un binario di prova, fatta con g ++ e ldd base alle LDFLAGS descritte nella parte superiore del post. In questo esempio, il -framework ha funzionato.
$ otool -L vitaosx
vitaosx:
/Library/Frameworks/fwk1.framework/Versions/A/fwk1 (compatibility version 1.0.0, current version 1.0.0)
/Library/Frameworks/fwk2.framework/Versions/A/fwk2 (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)
Questo problema può essere collegato al flag "-undefined dynamic_lookup" nel passaggio di collegamento? Sono un po 'confuso dalle poche righe di documentazione che trovo su Google.
Cheers,
La ringrazio molto per la risposta. Sembra che il linker non farà riferimento i quadri nel prodotto .so file se almeno un arco non si trova nel quadro. Nel mio caso, il mio framework include le varianti ppc e i386. Tutto funziona correttamente con la distribuzione python di base inclusa in MacOSX se forzo manualmente i flag -arch al passaggio di collegamento su "i386". Potrei trovare i miei framework se eseguo otool sul file .so prodotto. Ma se io uso le impostazioni predefinite del sistema di i386 -arch -arch ppc -arch x86_64, il file .so non è collegata a nessuno dei miei quadri. – madflo
L'opzione 1 è sfortunatamente non disponibile, in quanto i framework sono forniti in quanto privi di qualsiasi fonte. Sembra impossibile ottenere una versione più recente dai miei provider. Opzione 2 sta lavorando. Grazie, ho quasi dimenticato di avere un binario python in bundle con macosx ... L'opzione 3 è, molto stranamente, non funziona. L'unico arco che appare sul passo di collegamento del buildutils è i386, come previsto, ma il .so non è collegato a nessuno dei framework. Proverò a risolvere questo problema. – madflo