私はPython + numpyを呼び出すC++アプリケーションをビルドしています。私はpython dllをDELAYLOADしたいと思います。私は64ビットのPython 3.6でWindows上でVisual Studio 2015を使用します。私がnumpyを使用していない限り、DELAYLOADはうまく動作します。私がimport_array()
と呼ぶとすぐに、私はもはやDELAYLOADオプションでビルドできません。リンカエラーはPython埋め込み時の遅延ロードpython DLL + numpy
です。LNK1194は、データシンボル '__imp_PyExc_ImportError'のインポートにより '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のデータを作成して埋め込むことは可能ですか?
EDIT: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");
}
Release/Debugをビルドするには2種類ありますか?いつかこれが役立ちます。 – fghj
残念ながら、numpyのビルドを見つけられず、デバッグできないため、リリースLIB/DLLのみを使用してください。 –
C++アプリケーションでnumpyをどのように参照していますか? numpyの指示に従ってソースからビルドしましたか? – denfromufa