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

Unresolved external symbol error while using CImg library

我正在尝试使用 CImg 库来完成一些图像处理任务。在 Windows 7 x64 上使用 VS 2012,我正在构建一个项目以 create 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)

任何人都可以向我解释我做错了什么以及如何解决它吗? (我是 C++ 术语的新手。)

这个函数是win32的一部分API,特别是在GDI中。您需要将项目设置更改为 link 和 Gdi32.lib

https://msdn.microsoft.com/en-us/library/windows/desktop/dd162974(v=vs.85).aspx

there is nothing other than the header file in the CImg library to link to.

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

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

一些提示:

  1. __imp_ 前缀表明您正在查看 Windows API 函数。
  2. 如果您不知道,您可以随时忽略前缀和 Google 名称的可读部分,在本例中为 SetDIBitsToDevice。很有可能您会找到文档或至少可以为您指明正确方向的内容。

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

Header: Wingdi.h (include Windows.h)
Library: Gdi32.lib
DLL: Gdi32.dll

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

导出的函数

一般来说,在构建 Windows 应用程序时,您需要 link 至少 kernel32.libuser32.libgdi32.lib .

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