Estoy intentando construir una extensión Python en MacOSX 10.6 y vincularla con varios frameworks (solo i386). Hice un archivo setup.py, usando distutils y el objeto Extension.Creando un módulo python y vinculándolo con un framework MacOSX
I para ligar en contra de mis marcos, mis LDFLAGS env var debe verse como:
LDFLAGS = -lc -arch i386 -framework fwk1 -framework fwk2
Como no he encontrado ninguna palabra clave 'marco' en la documentación del módulo de extensión, he utilizado la extra_link_args palabra clave en su lugar.
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++')
Todo está compilando y enlazando bien. Si elimino la línea -framework de extra_link_args, mi enlazador falla, como se esperaba. Aquí están las dos últimas líneas producidas por una acumulación de pitón 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
Por desgracia, la .so que acaba de producir no es capaz de encontrar varios símbolos proporcionados por este marco. Traté de verificar el marco vinculado con otool. Ninguno de ellos está apareciendo.
$ 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)
No es la salida de Ejecución otool en un binario de prueba, hecha con g ++ y ldd utilizando los LDFLAGS descritos en la parte superior de mi puesto. En este ejemplo, el marco trabajó.
$ 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)
¿Puede este problema estar relacionado con el indicador "-dinámico definido indefinido" en el paso de enlace? Estoy un poco confundido por las pocas líneas de documentación que encuentro en Google.
Saludos,
Muchas gracias por su respuesta. Parece que el vinculador no hará referencia a los marcos en el archivo .so producido si al menos un arco no se encuentra en el marco. En mi caso, mi marco incluye las variantes ppc e i386. Todo está funcionando bien con la distribución básica de python incluida en MacOSX si forzo manualmente los indicadores de búsqueda en el paso de vinculación a "i386". Es posible que encuentre mis marcos si ejecuto la copia de sonido en el archivo .so producido. Pero si uso los valores predeterminados del sistema de -arch i386 -arch ppc -arch x86_64, el archivo .so no está vinculado a ninguno de mis marcos. – madflo
La opción 1 desafortunadamente no está disponible, ya que los marcos se proporcionan sin ningún origen. Parece imposible obtener una versión más nueva de mis proveedores. La opción 2 está funcionando. Gracias, casi olvidé que tenía un paquete binario de pitón con macosx ... La opción 3 es, muy extrañamente, que no funciona. El único arco que aparece en el paso de enlace de buildutils es i386, como se esperaba, pero .so no está vinculado a ninguno de los marcos. Intentaré aclarar este problema. – madflo