Pregunta

Hola, sé cómo hacer que la biblioteca (dll) en Windows con Visual Studio 2012 con C ++ e importación en Python con Ctypes funcione muy bien

Aquí pequeño ejemplo

lib.cpp

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int sum(int a,int b)
{
return (a+b);
}

lib.h

int sum(int,int); 

test.py

from ctypes import *
mydll=cdll.LoadLibrary('lib.dll')
print mydll.sum(2,2)

Intento ejecutar el mismo código en Mac con la versión Xcode 4.4 cuando buld en xcode recibo un mensaje en guerra

__declspec attribute 'dllexport' is not supported

y cuando importe lib.dylib en python recibo error

AttributeError: dlsym(0x101afba30, sum): symbol not found

qué hice mal ? ¿Puede alguien escribir un código simple cómo puedo hacer un dylib en Mac con Xcode correcto para importar con ctypes en Python 2.6.4

O

¿Es la mejor manera de importar libos en Python en tanto el sistema para Mac y Win?

Básico Me gusta escribir código en Windows con Visual Studio 2012 Make DLL I y luego compilador simple en Mac con Xcode e importación en Python

¿Fue útil?

Solución

Su problema era que ya tenía el Dylib cargado en su intérprete Python. Solo reconstruir, no afectará lo que ha cargado en la memoria.

Solo haciendo otro LoadLibrary Puede o no volver a cargar la biblioteca, y no hay forma de obligarlo a hacerlo.

Tampoco hay forma de descargar y recargar bibliotecas en ctypes. La razón principal es que no hay una forma segura de hacerlo en todas las plataformas; de hecho, antes de 10.4, OS X en sí era una plataforma. (Y Python todavía tiene Código fuente actual en el árbol para admitir antes de 10.4 OS X en ctypes.) Pero también, tratar de crear un modelo que haga las cosas de la manera segura en cada plataforma no es exactamente trivial. Asi que, ctypes no lo intenta.

Si realmente necesitas hacerlo, el _ctypes módulo debajo ctypes Generalmente exporta las funciones necesarias a Python. Si conoce los nombres de su plataforma, puede encontrarlos con help(_ctypes), o mirando la fuente.

Brevemente, en la mayoría de las plataformas POSIX modernas (incluida OS X 10.5+) es _ctypes.dlclose(mydll._handle), mientras que en Win32, es _ctypes.FreeLibrary(mydll._handle). En cualquier caso, si alguna vez usa mydll Nuevamente (o cualquier función o valor a los que estuviera haciendo referencia de él), debe rezar por un Segfault. También puede Segfault on Salida. Y en Windows, es posible que en realidad no libere la biblioteca cuando se lo pida, y en algunos casos debe preguntarle a la biblioteca si está listo para descargar antes de que pueda hacerlo, y hay complejidades de subproceso, y ... bueno, solo lea la FreeLibrary documentos en MSDN y, por supuesto, la mano de mano para dlclose(3) en cada sistema POSIX que le importe.

En general, es una idea mucho mejor simplemente iniciar un nuevo proceso de intérprete.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top