小希望964 2023-04-08 10:28 采纳率: 100%
浏览 57
已结题

VS2022无法解析image外部符号

img

VS2022解析不了,不知道为什么
想用VS跑个opencl的一个带有图片部分的代码,但是好像跑不动,把opencv整进来了还是无法完成修改

  • 写回答

7条回答 默认 最新

  • 极客智能体-在线 2023-04-08 17:22
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    问题分析:

    错误提示 无法解析外部符号 image 告诉我们编译器找不到 image 这个符号的定义,可能是 image 这个变量或者函数的声明丢失或者没有链接到对应的库文件。

    解决方案:

    1. 检查是否正确引入相关头文件和库文件。

    如果代码中使用了相关头文件或者库文件,需要确认是否正确引入到项目中。我们可以在 Properties -> VC++ Directories -> Include DirectoriesLibrary Directories 中分别检查是否添加了头文件路径和库文件路径。

    1. 检查是否正确使用相关命名空间。

    如果变量或者函数是在某个命名空间下定义的,需要确认是否正确使用了对应的命名空间。

    1. 检查是否正确定义变量或者函数。

    如果变量或者函数没有正确的声明和定义,会导致编译器无法识别变量或者函数的名称。需要检查代码中是否正确声明和定义了相关变量或者函数。

    1. 检查是否链接了相关库文件。

    如果代码中引用了外部库函数,需要将对应的库文件链接到项目中。我们可以在 Properties -> Linker -> Input -> Additional Dependencies 中添加所需的库文件名。

    1. 检查是否正确编译代码。

    如果需要使用外部库函数,需要将相关的源文件编译成目标文件或者动态库。需要确认代码是否正确编译。

    代码示例:

    以下是一个简单的使用 OpenCL 处理图片的示例代码,其中包含了读取图片和写入图片的部分代码。在运行此示例代码之前,需要正确配置 OpenCL 环境并安装 OpenCV 库。

    #include <opencv2/opencv.hpp>
    #include <CL/cl.h>
    
    using namespace cv;
    
    cl_platform_id platform_id;
    cl_uint num_platforms;
    cl_device_id device_id;
    cl_uint num_devices;
    cl_context context;
    cl_command_queue command_queue;
    cl_program program;
    cl_kernel kernel;
    
    void check_error(cl_int error_code, const char* message) {
        if (error_code != CL_SUCCESS) {
            printf("%s Error code: %d\n", message, error_code);
            exit(0);
        }
    }
    
    int main(int argc, char** argv) {
    
        // 读取图片
        Mat img = imread("input.jpg", IMREAD_GRAYSCALE);
        if (img.empty()) {
            printf("Error: cannot load image.\n");
            return -1;
        }
    
        cl_mem mem_image;
        cl_image_format format;
        format.image_channel_order = CL_R;
        format.image_channel_data_type = CL_UNSIGNED_INT8;
    
        cl_int error_code;
    
        // 初始化 OpenCL 环境
        error_code = clGetPlatformIDs(1, &platform_id, &num_platforms);
        check_error(error_code, "Unable to get platform ID.");
        error_code = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, &num_devices);
        check_error(error_code, "Unable to get device ID.");
        context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &error_code);
        check_error(error_code, "Unable to create context.");
        command_queue = clCreateCommandQueue(context, device_id, 0, &error_code);
        check_error(error_code, "Unable to create command queue.");
    
        // 创建 OpenCL 图像对象
        size_t origin[3] = { 0,0,0 };
        size_t region[3] = { img.cols,img.rows,1 };
        mem_image = clCreateImage2D(context, CL_MEM_READ_WRITE, &format, img.cols, img.rows, 0, NULL, &error_code);
        check_error(error_code, "Unable to create image.");
    
        // 将图片数据拷贝到设备端
        error_code = clEnqueueWriteImage(command_queue, mem_image, CL_TRUE, origin, region, 0, 0, img.data, 0, NULL, NULL);
        check_error(error_code, "Unable to write image.");
    
        // 创建 OpenCL 程序
        FILE* fp = fopen("kernel.cl", "r");
        if (fp == NULL) {
            printf("Error: cannot open file.\n");
            return -1;
        }
        fseek(fp, 0, SEEK_END);
        size_t size = ftell(fp);
        rewind(fp);
        char* source = (char*)malloc(size + 1);
        fread(source, sizeof(char), size, fp);
        source[size] = '\0';
        fclose(fp);
        program = clCreateProgramWithSource(context, 1, (const char**)&source, NULL, &error_code);
        check_error(error_code, "Unable to create program.");
    
        // 编译 OpenCL 程序
        error_code = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
        if (error_code != CL_SUCCESS) {
            char buffer[2048];
            clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, NULL);
            printf("Compilation failed:\n%s", buffer);
            return -1;
        }
    
        // 创建 OpenCL 内核
        kernel = clCreateKernel(program, "process_image", &error_code);
        check_error(error_code, "Unable to create kernel.");
    
        // 设置 OpenCL 内核参数
        error_code = clSetKernelArg(kernel, 0, sizeof(cl_mem), &mem_image);
        check_error(error_code, "Unable to set kernel argument.");
        int width = img.cols;
        error_code = clSetKernelArg(kernel, 1, sizeof(int), &width);
        check_error(error_code, "Unable to set kernel argument.");
    
        // 运行 OpenCL 内核
        size_t global_item_size[2] = { img.cols, img.rows };
        error_code = clEnqueueNDRangeKernel(command_queue, kernel, 2, NULL, global_item_size, NULL, 0, NULL, NULL);
        check_error(error_code, "Unable to enqueue kernel.");
    
        // 将结果数据拷贝回主机端
        error_code = clEnqueueReadImage(command_queue, mem_image, CL_TRUE, origin, region, 0, 0, img.data, 0, NULL, NULL);
        check_error(error_code, "Unable to read image.");
    
        // 写入图片
        imwrite("output.jpg", img);
        
        // 释放资源
        clReleaseMemObject(mem_image);
        clReleaseKernel(kernel);
        clReleaseProgram(program);
        clReleaseCommandQueue(command_queue);
        clReleaseContext(context);
    
        return 0;
    }
    

    参考资料:

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 4月17日
  • 已采纳回答 4月9日
  • 创建了问题 4月8日

悬赏问题

  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题