2010-05-07 6 views
9

He tomado una biblioteca que se distribuye como lib binario (.a) y encabezado, he escrito un código C++ y quiero ajustar los resultados en una python módulo.extensión python c, problemas con dlopen en mac os

He hecho esto here.

El problema es que al importar este módulo en Mac OS X (He intentado 10.5 y 10.6), me sale el siguiente error:

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 

Esto se ve como símbolos definidos en el marco de carbono no son se resuelve adecuadamente, pero no estoy seguro de qué hacer al respecto. Estoy suministrando el -framework Carbon al distutil.core.Extension del parámetro extra_link_args, así que no estoy seguro de qué más debería hacer.

Cualquier ayuda sería muy apreciada.

Actualización:

La línea de compilación generado por setup.py se ve así:

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 

La línea de enlazador se ve así:

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 informes:

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) 

Actualización 2: en MacOS 10.5, la modificación de las banderas que dlopen del valor predeterminado de RTLD_NOW a RTLD_LAZY soluciona el problema. Sin embargo, esto no funciona en Mac OS 10.6.

En 10.6, la siguiente secuencia permite que la biblioteca se ejecute correctamente, aunque no estoy seguro de por qué:

  1. pitón setup.py construir -v
  2. ejecutar la línea de enlazador (impreso a la consola por setup.py) nuevamente, manualmente.
  3. python setup.py install

Todavía estoy buscando una buena respuesta en cuanto a cómo conseguir que esto funcione correctamente. ¡Gracias!

+1

¿Cuál es el compilador real línea de comandos que setup.py ejecuta? Borre el directorio 'build' y ejecute' setup.py build -v' para ver. Además, ¿qué dice 'otool -L' sobre el archivo' dirac.so'? –

+0

@Thomas, he actualizado la pregunta con esa información, gracias. –

+0

Eso se ve bien entonces; el argumento -framework está en el lugar proscrito.Lo único que puedo imaginar es que necesitas un marco diferente, o que se supone que el marco introduce una dependencia shlib y de alguna manera no lo es (no sé si se supone que el marco de carbono haga eso o no). –

Respuesta

4

¡Te vas a patear cuando veas la respuesta a esto! Intente cambiar esto:

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

a esto:

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

Una vez que hice este cambio yo era capaz de hacer una construcción limpia e importar el módulo de inmediato :)

+0

Increíble. ¡Gracias! –