0

为了使用 OpenCL 而重新学习 C++。我创建了一个名为 CheckDevice 的 Helper 类,它有一堆用于获取设备统计信息的样板代码。

检查设备.h

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


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

    private:

    };

检查设备.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;
    }

主文件

    void main()
    {

        cl_kernel kernel            = 0;


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

    }

问题是从 CheckDevice.cpp 中调用函数 Utils::IsNull 时,它工作正常,但是从 main.cpp 调用时,我在 Visual Studios 2012 中得到以下信息

错误 LNK2019:未解析的外部符号“公共:静态布尔 __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 unresolved externals

任何帮助都会得到帮助

4

2 回答 2

1

您没有显示IsNull模板的实现,但它可能在CheckDevice.cpp. 它应该被放置CheckDevice.h,编译器需要看到它的定义才能实例化它。

于 2013-09-07T01:35:31.743 回答
-2
  • main.cpp 上存在调用约定问题。当您尝试在 main 上进行函数调用时,您需要首先创建该类对象的实例,然后再进行函数调用。你在你的主上错过了那个。
  • 所以基本上你需要创建一个 Utils 的实例并引用它。
  • cl_kernel 内核 = 0;
  • 实用程序 *ut = new Utils();
  • ut->IsNull"<"cl_kernel">"(内核, "clCreateKernel");
于 2013-09-07T02:14:44.980 回答