2016-06-27 9 views
0

は、このサンプル・コードをコンパイルしようとして:https://github.com/boostorg/compute/blob/master/README.mdブーストコンピューティング(OpenCLのラッパー)、初期セットアップの問題(QT、G ++)

私は

を使用してブーストライブラリをコンパイルmingw530

を使用してQTクリエーター5.7をインストール

bootstrap.bat gcc 
b2 install --prefix="C:\Boostbuild" --toolset=gcc 
bjam --build-dir=c:/Dev/Boost/Boost_lib toolset=gcc stage 

私は、私もダウンロードしたOpenCLの1.1、1.2、および2.1 cl.hpp AMD SDK 3.0、2.9.1、および2.9

をインストールし、それを含めることを試みました。

コンパイルが開始されますが、私は、エラー

のスルーを取得するC:のDev \ブースト\コンピュート・マスター\は\ブーストを含める\ \コンピュート\ device.hpp:80:エラー:clRetainDevice `への未定義参照@ 4'

C:プロジェクト\ \ Users \ユーザーユーザー\ドキュメント\ビルドコンソールテストDesktop_Qt_5_7_0_MinGW_32bit-デバッグ\デバッグ\のmain.o:-1:機能で `ZN5boost7compute6deviceaSERKS1_ ':

を私はシンプルを試してみましたqtコンソールアプリ、ブースト計算で提供されるコードを使用

:これは、QTに固有ではない、私はまた、main.cppに中含めるのそれぞれに-Iをやっ

g++ -I/path/to/compute/include sort.cpp -lOpenCL 

を使用して、これをコンパイルしようとしました(下記参照)

理想的には、私は」 d。インクルードとすべて(および関連するamd sdkおよび/またはopenclのバージョン)と必要なインクルードライブラリを使って、そのページで与えられたサンプルをコンパイルする方法を知りたい。

マイqtのプロジェクトファイルライブラリ

INCLUDEPATH += C:\Dev\Boost\compute-master\include 
INCLUDEPATH += C:/Users/User/Downloads/dev/boost_1_61_0 
INCLUDEPATH += "C:\Program Files (x86)\AMD APP SDK\2.9-1\include" 

私のmain.cppに

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <boost/compute.hpp> 
//#define CL_USE_DEPRECATED_OPENCL_1_1_APIS 
//#undef CL_VERSION_1_2 
//#include <C:\Dev\OpenCL\2.1\cl.hpp> 

namespace compute = boost::compute; 

int main() 
{ 

    // get the default compute device 
    compute::device gpu = compute::system::default_device(); 

    // create a compute context and command queue 
    compute::context ctx(gpu); 
    compute::command_queue queue(ctx, gpu); 

    // generate random numbers on the host 
    std::vector<float> host_vector(1000000); 
    std::generate(host_vector.begin(), host_vector.end(), rand); 

    // create vector on the device 
    compute::vector<float> device_vector(1000000, ctx); 

    // copy data to the device 
    compute::copy(
     host_vector.begin(), host_vector.end(), device_vector.begin(), queue 
    ); 

    // sort data on the device 
    compute::sort(
     device_vector.begin(), device_vector.end(), queue 
    ); 

    // copy data back to the host 
    compute::copy(
     device_vector.begin(), device_vector.end(), host_vector.begin(), queue 
    ); 

    return 0; 
} 

私は含まcl.hppをコメント解除した場合、私はさらに

C:/Dev/Boost/compute-master/include/boost/compute/allocator/buffer_allocator.hpp:91: undefined reference to `[email protected]' 

答えて

1

「スルーを取得of errors "はリンクエラーです。AMP APP SDKライブラリ(libOpenCL.a se)が欠落しています。

など。
-L"C:\Program Files (x86)\AMD APP SDK\2.9-1\lib\x86" -lOpenCL

またはあなたのQT .proファイルに以下を追加することができます:MinGwのための32ビット版にリンクし、-lOpenCLはなり

# Ensure that the AMDAPPSDKROOT environment variable has been set 
OPENCL_ROOT = $$(AMDAPPSDKROOT) 
isEmpty(OPENCL_ROOT) { 
    error("Please set AMDAPPSDKROOT to the location of the AMD APP SDK") 
} else { 
    message(Using Boost from: $$OPENCL_ROOT) 
} 

INCLUDEPATH += $$OPENCL_ROOT/include 
LIBS += -L$${OPENCL_ROOT}/lib/x86 
LIBS += -lOpenCL 

注:AMDAPPSDKROOT環境変数が正常に作成されたときにAMD APP SDKをインストールします。あなたの場合は、

C:\Program Files (x86)\AMD APP SDK\2.9-1\ 
+0

に変更する必要があります。OPENCL_ROOT = "C:¥Program Files(x86)¥AMD APP SDK¥2.9-1"; LIBS + = -LOpenCL; #cl.hpp C:\ Dev \ Boost \ compute-master \ include \ boost \ compute \ device.hpp:91:エラー:未定義のclReleaseDevice @ 4への参照。 clと。私は以下を取得します:C:/Dev/Boost/compute-master/include/boost/compute/allocator/buffer_allocator.hpp:91: 'clReleaseMemObject @ 4 'への未定義の参照 – thistleknot

+0

大丈夫です。私は余分なINCLUDEPATHを2.9-1に取り除き、LIBS + = -lOpenCLに戻し、cl.hppへの参照を削除しました(これはsdkに含まれており、openclヘッダをダウンロードする必要はありません)。ありがとうございました! – thistleknot

+0

将来参照するために、 '-L'はライブラリパスを追加するために使われ、' -l'はライブラリを追加するために使われます。そのため、 'LIBS + = -LOpenCL'を' LIBS + = -lOpenCL'に変更することができました。 – kenba