2013-03-03 18 views
12

MingwとNvidia SDKを使用してOpenCLをコンパイルすることはできますか?Mingw Nvidia SDKでOpenCLをコンパイル

正式にはサポートされていませんが、意味が分かりません。ライブラリは静的にリンクされたライブラリとして提供されていませんか?私は一度、どのコンパイラでコンパイルされていても、正常にリンクされていることを意味します。問題は何でしょうか?

NvidiaのSDKで提供されているOpenCLライブラリにコードをコンパイルしてもうまくリンクすることができましたが、コードでclGetPlatformIDsにセグメンテーションフォルトがスローされます。

はここで、これらのライブラリは、サンプルのOpenCLコードのの.slnファイルから取られたこと

x86_64-w64-mingw32-g++ -std=c++11 File.cpp \ 
-L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64" \ 
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" \ 
-gcoff -lOpenCL -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 \ 
-lshell32 -lole32 -loleaut32 \ 
-luuid -lodbc32 -lodbccp32 -luser32 -lgdi32 -lmingwex -m64 \ 
-DWIN32 -D_DEBUG -D_CONSOLE 

注意私のコンパイルコマンドです。

私はこれらのライブラリのさまざまな組み合わせを試みましたが、何も動作していないようです。

また、Mingwを使用してコンパイルし、何か別の方法でリンクする方法はありますか?私は何か他のものがあるかもしれないか分からない。

+0

VC++ Expressを使用してホストコードを構築してみませんか?また、32ビットまたは64ビットのlibsを使用していますか? CUDA \ v5.0 \ lib \ x64と-luse32 -lcomdlg32 -ladvai32 ... -m64の混乱が混在していますが、これらのライブラリはすべて必要ですか?コマンドラインを単純化する。 –

+1

64ビット、私のC++コードはC++ 11の機能を使用しているので、VC++は使えません。私はlibsを削除して追加しようとしました。 – omarzouk

答えて

12

MinGW reimpとdlltoolユーティリティを使用して、 "OpenCL.dll" DLL用のインポートライブラリ "libOpenCL.a"を作成することができました。

  • ステップ1:mimp-utilsがインストールされていることを確認します(reimpとdlltool用)。次に、次のコマンドを入力します:

    reimp OpenCL.lib

  • mingwの-utilsのに

  • ステップ2をインストールmingwの-取得:あなたはMinGWのプロンプトで、ない場合

これにより、OpenCL.defファイルとlibOpenCL.aファイルが生成されます。結果が "無効または破損したインポートライブラリ"の行に沿ったものである場合、代替手順2が機能するはずです。

  • 代替ステップ2:http://pastebin.com/f2ac38b2f:あなたがここで見つけることができます.defファイルと一緒にDLLTOOL使用してください。コマンドは次のようになります。

    DLLTOOL -l libOpenCL.a -d OpenCL.def -A -k

あなたは今、新しく作成されたlibOpenCL.aにリンクすることができます。シンボルが見つからない場合は、.defファイルに追加してdlltoolコマンドを繰り返します。

我々は、参照のために、次の記事で見つけた情報には、このすべての作業のおかげで、得ることができました:

  1. http://oscarbg.blogspot.com/2009/12/opencl-with-mingw.html
  2. http://www.mingw.org/wiki/CreateImportLibrariesを(私は2つのリンクを貼り付けることができます)
+0

これは、少なくともGPU Computing SDK 5.5とリンクできることを確認しました。 – imallett

2

のOpenCLライブラリはOpenCL.dllのスタブです。したがって私は動的ロード技術を使用することをお勧めします。それは単にすべての問題を解決します。それとも、OpenCLのnVIDIAの調整が本当に必要ですか?

実行時に安全であるだけでなく、リンカーが必要ないため、また何も定義されていないため、コンパイルが簡単です。あなたのproyectに追加された単純なcpp/hppファイル。

非常に良いものはCLEWです。しかし、C++ラッパーが壊れているので、私はそのライブラリと完全に同意しません。だから多分あなたは微調整が必​​要になるでしょう。また、問題の可能性があるので、通常は "atexit"コードを無効にします。

+0

クルーは死んでしまったようですか? – rogerdpack

関連する問題