使用 CImg 库时未解决的外部符号错误

Pra*_*har 2 c++ dll image-processing cimg visual-studio-2012

我正在尝试将CImg库用于某些图像处理任务。在Windows 7 x64上使用VS 2012,我正在构建一个项目来创建我的应用程序所需的dll。我已经包含了库中唯一的头文件CImg.h。但是一旦我初始化了一个 CImg 对象,我就会收到一堆未解决的外部符号错误。一个示例错误如下:

layer.obj : error LNK2019: unresolved external symbol __imp_SetDIBitsToDevice referenced in function "public: struct cimg_library::CImgDisplay & __cdecl cimg_library::CImgDisplay::paint(void)" (?paint@CImgDisplay@cimg_library@@QEAAAEAU12@XZ)
Run Code Online (Sandbox Code Playgroud)

谁能向我解释我做错了什么以及如何解决它?(我是 C++ 术语的新手。)

Cod*_*ray 5

除了要链接到的 CImg 库中的头文件之外,别无其他。

您不能链接到头文件。如果它是一个只有头文件的库,那么你不需要链接任何东西。你包含头文件,它定义的函数是直接编译的。CImg 似乎就是这种情况;文档说它是一个自包含的模板库,只包含一个头文件。因此,确实,您需要做的就是包含它,然后您就可以参加比赛了。

未解决的外部符号错误来自其他地方。您必须阅读错误消息并查看函数名称以查看位置。

几个提示:

  1. __imp_前缀建议您正在寻找一个Windows API函数。
  2. 如果您不知道这一点,您可以随时忽略前缀并搜索名称的可读部分,在本例中为SetDIBitsToDevice. 很有可能你会打开文档或者至少是一些可以为你指明正确方向的东西。

实际上,在这种情况下,您可以直接访问 Microsoft 的该SetDIBitsToDevice函数的 SDK 文档。这是一个 Windows API 函数,微软的文档总是告诉你需要链接到哪个库才能使用它。查看页面底部:

头文件:Wingdi.h(包括 Windows.h)
:Gdi32.lib
DLL:Gdi32.dll

CImg 库头文件显然已经包含了 Windows.h 头文件,否则你会得到一个编译时错误。您收到链接器错误,这意味着您没有告诉链接器在Gdi32.lib库中进行链接。这将允许您调用 GDI 函数。它是一个存根,便于调用从Gdi32.dll.

在一般情况下,建立一个Windows应用程序时,你会想和链接,至少,kernel32.libuser32.lib,和gdi32.lib

此问题包含有关处理未定义符号错误以及如何配置链接器的更多信息。在 Visual Studio 中,转到项目属性 → C/C++ → 链接器 → 输入 → 附加依赖项。或者添加#pragma comment(lib, "gdi32.lib")到源文件中(你的预编译头是个好地方,通常命名为StdAfx.h)。