使用 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 似乎就是这种情况;文档说它是一个独立的模板库,仅包含一个头文件。所以确实,您需要做的就是包括它,然后您就可以参加比赛了。
未解决的外部符号错误来自其他地方。您必须阅读错误消息并查看函数名称以查看位置。
一些提示:
__imp_
前缀表明您正在查看 Windows API 函数。
- 如果您不知道,您可以随时忽略前缀和 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.lib
、user32.lib
和 gdi32.lib
.
This question 包含有关处理未定义符号错误以及如何配置 linker 的更多信息。在 Visual Studio 中,转到项目属性 → C/C++ → 链接器 → 输入 → 附加依赖项。或者在一个源文件中加入#pragma comment(lib, "gdi32.lib")
(你的预编译头是个好地方,通常命名为StdAfx.h
)。
我正在尝试使用 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 似乎就是这种情况;文档说它是一个独立的模板库,仅包含一个头文件。所以确实,您需要做的就是包括它,然后您就可以参加比赛了。
未解决的外部符号错误来自其他地方。您必须阅读错误消息并查看函数名称以查看位置。
一些提示:
__imp_
前缀表明您正在查看 Windows API 函数。- 如果您不知道,您可以随时忽略前缀和 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.lib
、user32.lib
和 gdi32.lib
.
This question 包含有关处理未定义符号错误以及如何配置 linker 的更多信息。在 Visual Studio 中,转到项目属性 → C/C++ → 链接器 → 输入 → 附加依赖项。或者在一个源文件中加入#pragma comment(lib, "gdi32.lib")
(你的预编译头是个好地方,通常命名为StdAfx.h
)。