【问题标题】:Unresolved external symbol error while using CImg library使用 CImg 库时未解决的外部符号错误
【发布时间】:2016-11-26 17:07:00
【问题描述】:

我正在尝试将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)

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

【问题讨论】:

  • 您需要告诉 MSVC(编译器)链接到库。我认为在 VS 中,它是通过项目设置菜单完成的。使用库背后的想法是,您需要 (A) 包含头文件和 (B) 链接到 DLL。这些由编译器的不同部分在构建过程的 2 个不同阶段使用。
  • 但是除了CImg库中的头文件外没有其他东西可以链接。

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


【解决方案1】:

除了 CImg 库中的头文件之外没有其他要链接的文件。

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

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

几个提示:

  1. __imp_ 前缀表明您正在查看 Windows API 函数。
  2. 如果您不知道这一点,您总是可以忽略前缀并在 Google 上搜索名称的可读部分,在本例中为 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.libgdi32.lib

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

【讨论】:

    【解决方案2】:

    此函数是 win32 API 的一部分,特别是在 GDI 中。您需要更改项目设置以与 Gdi32.lib 链接

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

    【讨论】:

    • 是的,我必须链接到包括 gdi32 在内的一些库才能成功构建项目。谢谢你的回答。
    猜你喜欢
    • 2021-02-04
    • 2011-09-03
    • 2010-11-20
    • 2023-03-05
    • 2017-07-20
    • 2011-10-21
    • 2012-10-21
    • 2014-05-12
    相关资源
    最近更新 更多