我正在尝试使用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 ++术语方面,我是新手。)
答案 0 :(得分:3)
除了要链接到的CImg库中的头文件之外别无其他。
您无法链接到头文件。如果它是一个仅限标题的库,那么您不需要链接任何内容。您包含头文件,它定义的函数直接编译。这似乎是CImg的情况;文档说它是一个独立的模板库,只包含一个头文件。所以,你需要做的就是把它包括在内,然后再参加比赛。
未解决的外部符号错误来自其他地方。您必须阅读错误消息并查看函数名称以查看位置。
一些提示:
__imp_
前缀表示您正在查看Windows API函数。SetDIBitsToDevice
。机会非常好,你可以打开文档或至少指出正确方向的东西。的确,在这种情况下,您可以使用Microsoft SetDIBitsToDevice
功能的Microsoft SDK文档。它是一个Windows API函数,微软的文档总是告诉你需要链接到哪个库才能使用它。请查看页面底部:
标题:Wingdi.h(包括Windows.h)
图书馆:Gdi32.lib
DLL :Gdi32.dll
CImg库头文件显然已经包含了Windows.h头文件,或者您遇到了编译时错误。您收到链接器错误,这意味着您没有告诉链接器链接Gdi32.lib
库。这将允许您调用GDI函数。它是一个存根,便于调用从Gdi32.dll
导出的函数。
通常,在构建Windows应用程序时,您至少需要与kernel32.lib
,user32.lib
和gdi32.lib
进行关联。
This question包含有关处理未定义符号错误的更多信息,以及如何配置链接器。在Visual Studio中,转到项目属性→C / C ++→链接器→输入→附加依赖项。或者将#pragma comment(lib, "gdi32.lib")
添加到源文件(您的预编译头是一个好地方,通常命名为StdAfx.h
)。
答案 1 :(得分:1)
此函数是win32 API的一部分,特别是在GDI中。您需要更改项目设置以与Gdi32.lib链接
https://msdn.microsoft.com/en-us/library/windows/desktop/dd162974(v=vs.85).aspx