I am building a C++ application that will call python + numpy and I would like to DELAYLOAD the python dll. I use Visual Studio 2015 on Windows with 64 bit python 3.6. The DELAYLOAD works fine as long as I am not using numpy. As soon as I call import_array(), I can no longer build with DELAYLOAD option. The linker error is 
LNK1194 cannot delay-load 'python36.dll' due to import of data symbol '__imp_PyExc_ImportError'; link without /DELAYLOAD:python36.dll.
Here is my code:
// Initialize python
Py_Initialize();
// If I remove this line, I am able to build with DELAYLOAD
import_array();
Is there any way to make delay load possible when using numpy?
Alternative question: is it possible to create and fill with data a numpy.recarray without calling import_array()?
EDIT: I decided to get rid of import_array(). Here is some of the code that I use to initialize Python:
    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");
    }
                Is there any way to make delay load possible when using numpy?
You might not be able to use DELAYLOAD with import_array:
You cannot delay load a DLL if data is imported from it (official documentation).
import_array imports the module where the function-pointer table is stored and points the correct variable to it (official documentation).
I doubt you are dealing with a case of exporting classes versus exporting data members. See this, this, or this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With