嵌入python + numpy时延迟加载python DLL

时间:2017-06-23 20:05:23

标签: python c++ c numpy visual-c++

我正在构建一个将调用python + numpy的C ++应用程序,我想DELAYLOAD python dll。我在Windows上使用64位python 3.6的Visual Studio 2015。只要我不使用numpy,DELAYLOAD就可以正常工作。一旦我调用import_array(),我就无法再使用DELAYLOAD选项进行构建。链接器错误是

  

由于导入数据符号'__imp_PyExc_ImportError',LNK1194无法延迟加载'python36.dll';没有/DELAYLOAD:python36.dll的链接。

这是我的代码:

// Initialize python
Py_Initialize();

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

使用numpy时有没有办法让延迟加载?

替代问题:是否可以在不调用import_array()的情况下创建和填充numpy.recarray数据?

编辑:我决定摆脱import_array()。以下是我用来初始化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");
    }

2 个答案:

答案 0 :(得分:1)

使用numpy时有什么方法可以延迟加载吗?

您可能无法将DELAYLOADimport_array

一起使用
  1. 如果从中导入数据(https://angular-translate.github.io/docs/#/guide),则无法延迟加载DLL。

  2. import_array导入存储函数指针表的模块,并将正确的变量指向它(official documentation)。

  3. 我怀疑您是在处理导出类导出数据成员的情况。 请参阅official documentationthisthis

答案 1 :(得分:0)

这也可能是由优化引起的,如here所示。

您还可以在项目设置中尝试Remove unreferenced code and data