2017-06-23 9 views
7

Ich bin ein C++ - Anwendung, die Python + numpy aufrufen wird und ich möchte DELAYLOAD die Python-DLL. Ich benutze Visual Studio 2015 unter Windows mit 64-Bit-Python 3.6. DELAYLOAD funktioniert gut, solange ich nicht numpy benutze. Sobald ich import_array() rufe, kann ich nicht mehr mit DELAYLOAD Option bauen. Der Linker FehlerVerzögerung laden python DLL beim Einbetten von Python + numpy

LNK1194 nicht verzögerungs load 'python36.dll' aufgrund Import des Datensymbols '__imp_PyExc_ImportError'; Link ohne/DELAYLOAD: python36.dll.

Hier ist mein Code:

// Initialize python 
Py_Initialize(); 

// If I remove this line, I am able to build with DELAYLOAD 
import_array(); 

Gibt es eine Möglichkeit Verzögerung Last möglich bei der Verwendung von numpy zu machen?

Alternative Frage: ist es möglich, eine numpy.recarray zu erstellen und mit Daten zu füllen, ohne import_array() aufzurufen?

EDIT: Ich beschloss, import_array() loszuwerden. Hier ist ein Teil des Codes, die ich benutze Python zu initialisieren:

if (!Py_IsInitialized()) 
    { 
     // Initialize Python 
     Py_Initialize(); 

     // Initialize threads 
     PyEval_InitThreads(); 

     // Needed for datetime 
     PyDateTime_IMPORT; 

     // Needed to avoid use of Py_None, Py_True, and Py_False; 
     // which cause inability to use DELAYLOAD 
     HMODULE pythonDll = GetModuleHandle(L"python36.dll"); 
     if (pythonDll == nullptr) 
     { 
      throw gcnew NotSupportedException(L"GS_ERR_CannotInitialize"); 
     } 
     PythonHelper::_pyNone = (PyObject*)GetProcAddress(pythonDll, "_Py_NoneStruct"); 
     PythonHelper::_pyTrue = (PyObject*)GetProcAddress(pythonDll, "_Py_TrueStruct"); 
     PythonHelper::_pyFalse = (PyObject*)GetProcAddress(pythonDll, "_Py_FalseStruct"); 
    } 
+0

Haben Sie versucht, zwei Varianten von Build Release/Debug? Manchmal hilft das. – fghj

+0

Leider konnte ich nicht finden und Debug Build von numpy, so nur mit Release LIB/DLL –

+0

Wie verweisen Sie numpy in Ihrer C++ App? Hast du es aus der Quelle nach numpy Anweisungen gebaut? – denfromufa

Antwort

1

Gibt es eine Möglichkeit Verzögerung Last möglich zu machen, wenn numpy mit?

Sie könnten nicht in der Lage sein DELAYLOAD mit import_array zu verwenden:

  1. Sie nicht eine DLL laden verzögern kann, wenn Daten aus dem Import (official documentation).

  2. import_array importiert das Modul, in dem die Funktionszeiger-Tabelle gespeichert ist, und zeigt darauf die richtige Variable an (official documentation).

Ich bezweifle, dass Sie mit einem Fall von exportierenden Klassen Mitglieder gegen Exportieren von Daten handeln. Siehe this, this oder this.

+0

Könnten Sie bitte einen Link zur offiziellen Dokumentation von numpy geben, die besagt, dass das unmöglich ist. –

+0

@AndreyBelykh - Numpy Dokumentation würde wahrscheinlich keine Probleme mit der Verknüpfung mit bestimmten Linkern + Flags erwähnen, das wäre zu spezifisch. Aber ich habe die Antwort mit der offiziellen Dokumentation von MSVS + numpy aktualisiert, die den Schluss erlaubt. –

+0

Vielen Dank. Sieht so aus, als müsste ich import_array() vermeiden. –

0

Dies kann auch durch Optimierung verursacht werden, wie gesehen here.

Sie können auch versuchen, Remove unreferenced code and data in den Projekteinstellungen.

+0

Entfernen von nicht referenziertem Code und Daten wird auf "true" gesetzt –