myPythonClient
(unten) möchte eine ringBell
-Funktion aufrufen (geladen von einer DLL mit ctypes
). Wenn Sie jedoch versuchen, über den Namen auf ringBell
zuzugreifen, erhalten Sie AttributeError
. Warum?
RingBell.h
enthält
RingBell.cpp
enthält
myPythonClient.py
enthält
Vielleicht, weil der C ++ - Name vom Compiler gemangelt und nicht aus der DLL als RingBell
exportiert wird. Haben Sie überprüft, dass es genau so in den exportierten Namen erscheint?
Ihr C ++ - Compiler migriert die Namen aller extern sichtbaren Objekte, um ihre Namespaces, Klassen und Signaturen (sowie ihre zugrundeliegenden Namen) widerzuspiegeln (so wird das Überladen möglich).
Um dies zu vermeiden, benötigen Sie extern "C"
für extern sichtbare Namen, die aus Nicht-C ++ - Code sichtbar sein sollen (und deshalb können solche Namen nicht überladen werden, noch können sie im C ++ - Standard inline sein) Namespaces oder innerhalb von Klassen, obwohl einige C ++ - Compiler den Standard in einigen dieser Richtungen erweitern.)
Alles funktioniert jetzt :) Um Ihre Beiträge zusammenzufassen:
Schreibe DLL in C ++:
%Vor%Dann können Sie Programm link.exe verwenden, um den tatsächlichen Funktionsnamen in dll zu sehen. link.exe ist zum Beispiel in MSVC2010 hier:
%Vor%verwenden:
%Vor%Sie sehen etwas wie:
%Vor%Dann in Python können Sie es als importieren:
%Vor%Tags und Links python dll ctypes attributeerror