【问题标题】:error LNK2019: unresolved external symbol "public: [duplicate]错误 LNK2019:未解析的外部符号“公共:[重复]
【发布时间】:2023-03-28 05:02:01
【问题描述】:

为了使用 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:在函数_main 1>C:\Users\Suri\Documents\Visual Studio 2012\Projects\HelloWorld\Debug\HelloWorld.exe : 致命错误 LNK1120: 1 unresolved externals

任何帮助将不胜感激

【问题讨论】:

  • void main() 应该是 int main()。无论您使用什么书或教程,都不应该告诉您void main() 是正确的,并且您的编译器应该警告您。买一本更好的书,并在你的编译器中启用警告。

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


【解决方案1】:

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

【讨论】:

  • 非常感谢它的工作。你的权利我偶然离开了 IsNull 的实现。为什么会这样?我从 CheckDevice.cpp 开始调用其他没有问题的函数。跟模板有关系吗?
【解决方案2】:
  • main.cpp 上存在调用约定问题。当您尝试在 main 上进行函数调用时,您需要首先创建该类对象的实例,然后再进行函数调用。你在你的主线上错过了那个。
  • 所以基本上你需要创建一个 Utils 实例并对其进行引用。
  • cl_kernel 内核 = 0;
  • Utils *ut = new Utils();
  • ut->IsNull""(kernel, "clCreateKernel");

【讨论】:

  • 但它是一个静态函数..
  • 另外你为什么要传递一个字符串作为模板类型?
  • 您仍然可以通过使用指向类实例的指针在 main 上调用静态函数。它工作得很好。
  • 正确,但不需要也不是问题。
猜你喜欢
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2013-01-28
  • 2012-10-31
  • 2012-08-31
相关资源
最近更新 更多