2017-06-23 15 views
7

私は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"); 
    } 
+0

Release/Debugをビルドするには2種類ありますか?いつかこれが役立ちます。 – fghj

+0

残念ながら、numpyのビルドを見つけられず、デバッグできないため、リリースLIB/DLLのみを使用してください。 –

+0

C++アプリケーションでnumpyをどのように参照していますか? numpyの指示に従ってソースからビルドしましたか? – denfromufa

答えて

1

はnumpyのを使用している場合、遅延ロードを可能にする方法はありますか?

あなたはimport_arrayDELAYLOADを使用することができない場合があります:データは、それ(official documentation)から輸入されている場合は、DLLをロード遅らせることはできません

  1. import_arrayファンクションポインタテーブルが格納されているモジュールをインポートし、正しい変数をポイントします(official documentation)。

私はあなたがエクスポートデータメンバーエクスポートクラスの場合を扱っている疑い。 this,thisまたはthisを参照してください。

+0

numpyの公式文書へのリンクを教えてください。それは不可能です。 –

+0

@AndreyBelykh - Numpyのドキュメントでは、特定のリンカー+フラグとのリンクに関する問題はあまり言及されていません。しかし、私は結論を可能にするMSVS + numpyの公式文書で答えを更新しました。 –

+0

ありがとうございます。 import_array()の使用を避けなければならないようです。 –

0

これは、hereのように、最適化によっても発生する可能性があります。

また、プロジェクト設定でRemove unreferenced code and dataを試すこともできます。

+0

参照されていないコードを削除し、データが "true"に設定されている –

関連する問題