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

时间:2016-07-22 17:43:46

标签: c++ visual-studio-2012 image-processing dll cimg

我正在尝试使用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 ++术语方面,我是新手。)

2 个答案:

答案 0 :(得分:3)

  

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

您无法链接到头文件。如果它是一个仅限标题的库,那么您不需要链接任何内容。您包含头文件,它定义的函数直接编译。这似乎是CImg的情况;文档说它是一个独立的模板库,只包含一个头文件。所以,你需要做的就是把它包括在内,然后再参加比赛。

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

一些提示:

  1. __imp_前缀表示您正在查看Windows API函数。
  2. 如果你不知道,你可以随时忽略前缀,Google可以忽略名称的可读部分,在本例中为SetDIBitsToDevice。机会非常好,你可以打开文档或至少指出正确方向的东西。
  3. 的确,在这种情况下,您可以使用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.libuser32.libgdi32.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