Domanda

Ciao so come creare libreria (DLL) in Windows con Visual Studio 2012 con C ++ e importare in Python con Ctypes funziona alla grande

qui piccolo esempio

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)

Provo a eseguire lo stesso codice in Mac con la versione Xcode 4.4 quando mi bull in xcode ottengo messaggio in guerra

__declspec attribute 'dllexport' is not supported

e quando importo lib.dylib in Python ricevo un errore

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

cosa ho sbagliato?qualcuno può scrivere un codice semplice come posso creare un dylib in Mac con xcode corretto da importare con Ctypes in Python 2.6.4

O

L'are è il modo migliore per importare le librerie in python in entrambi i sistemi per mac e win ?

Di base Mi piace scrivere codice in Windows con Visual Studio 2012 make DLL I e poi semplice compilatore in Mac con Xcode e importazione in python

È stato utile?

Soluzione

Il tuo problema era che avevi già caricato dylib nel tuo interprete Python.La semplice ricostruzione non influirà su ciò che hai caricato in memoria.

Ne faccio solo un altro LoadLibrary può o meno ricaricare la libreria e non c'è modo di forzarla a farlo.

Inoltre, non è possibile scaricare e ricaricare le librerie ctypes.Il motivo principale è che non esiste un modo sicuro per farlo su tutte le piattaforme: infatti, prima della 10.4, OS X stesso era una di queste piattaforme.(E Python lo ha ancora codice sorgente corrente nell'albero per supportare OS X precedente alla 10.4 ctypes.) Ma anche cercare di elaborare un modello che faccia le cose in modo sicuro su ogni piattaforma non è esattamente banale.COSÌ, ctypes non ci prova.

Se hai davvero bisogno di farlo, il _ctypes modulo sottostante ctypes generalmente esporta le funzioni necessarie in Python.Se conosci i nomi della tua piattaforma, puoi trovarli con help(_ctypes), o guardando la fonte.

In breve, sulla maggior parte delle moderne piattaforme POSIX (incluso OS X 10.5+) lo è _ctypes.dlclose(mydll._handle), mentre su Win32 lo è _ctypes.FreeLibrary(mydll._handle).In entrambi i casi, se mai lo utilizzerai mydll di nuovo (o qualsiasi funzione o valore a cui fai riferimento), dovresti pregare per un segfault.Puoi anche eseguire il segfault all'uscita.E su Windows, potrebbe non liberare effettivamente la libreria quando lo chiedi, e in alcuni casi devi chiedere alla libreria se è pronta per essere scaricata prima di poterlo fare, e ci sono complessità di threading, e... beh, basta leggere IL FreeLibrary documenti su MSDN e, naturalmente, la manpage per dlclose(3) su ogni sistema POSIX che ti interessa.

In generale, è invece un'idea molto migliore avviare semplicemente un nuovo processo di interpretariato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top