0

OpenCL を使用するための C++ の再学習。デバイスの統計情報を取得するための一連のボイラー プレート コードを含む CheckDevice というヘルパー クラスを作成しました。

CheckDevice.h

    class Utils
    {
    public:
        Utils(){};
        ~Utils(){};


        template<class T>
        static bool IsNull(T Object, char* name);

    private:

    };

CheckDevice.cpp

    cl_command_queue Utils::CreateCommandQueue(cl_context context, cl_device_id *device)
    {
        cl_int err;
        cl_device_id *devices;
        cl_command_queue queue  = NULL;
        size_t deviceBufferSize = -1;
        cl_kernel kernel = 0;


        Utils::IsNull<cl_command_queue>(queue, "Utils::CreateCommandQueue::queue");



        return queue;
    }

main.cpp

    void main()
    {

        cl_kernel kernel            = 0;


        Utils::IsNull<cl_kernel>(kernel, "clCreateKernel");

    }

問題は、関数 Utils::IsNull を CheckDevice.cpp 内から呼び出すときは正常に動作しますが、main.cpp から呼び出すときは、Visual Studios 2012 で次のようになることです。

エラー LNK2019: 未解決の外部シンボル "public: static bool __cdecl Utils::IsNull(struct _cl_kernel *,char *)" (??$IsNull@PAU_cl_kernel@@@Utils@@SA_NPAU_cl_kernel@@PAD@Z) 関数 _main 1 で参照>C:\Users\Suri\Documents\Visual Studio 2012\Projects\HelloWorld\Debug\HelloWorld.exe: 致命的なエラー LNK1120: 1 つの未解決の外部

どんな助けでも感謝します

4

2 に答える 2

1

テンプレートの実装は示していませんIsNullが、おそらくCheckDevice.cpp. 代わりに配置するCheckDevice.h必要があります。コンパイラは、インスタンス化できるようにその定義を確認する必要があります。

于 2013-09-07T01:35:31.743 に答える
-2
  • main.cpp に呼び出し規約の問題があります。メインで関数呼び出しを行う場合、関数呼び出しを行う前に、まずそのクラス オブジェクトのインスタンスを作成する必要があります。メインにそれがありません。
  • したがって、基本的には Utils のインスタンスを作成し、それを参照する必要があります。
  • cl_kernel カーネル = 0;
  • ユーティリティ *ut = new Utils();
  • ut->IsNull"<"cl_kernel">"(kernel, "clCreateKernel");
于 2013-09-07T02:14:44.980 に答える