错误LNK2019:未解析的外部符号" public:

时间:2013-09-07 01:29:55

标签: c++ templates visual-studio-2012

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

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");

    }

问题是当从CheckDevice.cpp中调用函数Utils :: IsNull时它工作正常,但是当从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) function _main   1&gt; C:\ Users \ Suri \ Documents \ Visual Studio 2012 \ Projects \ HelloWorld \ Debug \ HelloWorld.exe:致命错误LNK1120:1未解析的外部

任何帮助都会得到解决

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-2)

  • main.cpp上存在调用约定问题。当您尝试在main上进行函数调用时,首先需要在进行函数调用之前创建该类对象的实例。你错过了你的主要。
  • 所以基本上你需要创建一个Utils实例并引用它。
  • cl_kernel kernel = 0;
  • Utils * ut = new Utils();
  • ut-&gt; IsNull&#34;&lt;&#34; cl_kernel&#34;&gt;&#34;(内核,&#34; clCreateKernel&#34;);