未定义对 CreateCompatibleDC、BitBlt 等的引用?

Posted

技术标签:

【中文标题】未定义对 CreateCompatibleDC、BitBlt 等的引用?【英文标题】:Undefined reference to CreateCompatibleDC, BitBlt, etc.? 【发布时间】:2014-01-10 12:50:26 【问题描述】:

我已经链接到 gdi32.lib。无奈之下,我还链接到了两个不同版本的 gdi32.lib 以及 gdiplus.lib,并包含了我能找到的所有 gdi 头文件,但无济于事。然而,这个问题在额外链接之前就开始了,所以我认为我可以放心地假设我的问题不是库之间的冲突或任何类似的干扰。

包含/定义:

#define WINVER 0x0500
#define _WIN32_WINNT 0x0500
#include <iostream>
#include <process.h>
#include <windows.h>
#include <winuser.h>
#include <gdiplus.h>
#include "UVMap.h"

相关代码:

case WM_PAINT:
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        HDC hdcMemory = CreateCompatibleDC(hdc);
        BITMAP bmp = screen.getBitmap(hdcMemory);
        BitBlt(hdc,0,0,w,h,hdcMemory,0,0,SRCCOPY);
        EndPaint(hwnd,&ps);
        DeleteDC(hdc);
    break;

我在搜索此问题时发现的每个结果都声称您只需链接到 gdi32。以下是我添加的链接:

C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64\Gdi32.Lib C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\Gdi32.Lib C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\GdiPlus.lib

编辑:错误显示如下:

.../Testing.cpp:50: undefined reference to `CreateCompatibleDC@4'
.../Testing.cpp:52: undefined reference to `BitBlt@36'

这样吗?我在 Eclipse 中通过 Project > Properties > Path Variables 进行了链接。链接资源选项卡下没有条目,也无法编辑。

【问题讨论】:

不要硬编码库的路径。只要您的搜索路径设置正确(应该在安装 Visual Studio 时完成),您只需要指定库的名称即可。或者您可能更喜欢在代码中设置它,#pragma 注释 (lib,"Gdiplus.lib")。您设置的 Windows 版本似乎正确,Windows 2000 和 Windows.h 应该包含必要的标头。我唯一能猜到的,你确定你的链接正确吗? 甚至不清楚您是否有链接问题。显示一条或三条具有代表性的错误消息,并准确说明您是如何进行链接的。 我尝试将其添加到此评论中;请参阅上面的编辑。 如果您还包括实际用于链接程序的链接命令,这可能会有所帮助。 【参考方案1】:

您需要链接到coredll.lib for CreateCompatibleDC

您需要链接到Gdi32.lib for BitBlt

作为参考,当您收到涉及 Windows 函数的链接错误时,只需 google 该函数并转到该函数的 MSDN 文档(我已链接到这两个特定函数的两个页面),然后向下滚动到要求部分并确保您链接到指定的库。

【讨论】:

显然他已经链接了 Gdi32.lib。至于coredll.lib,我不确定,但我认为无论如何它应该默认存在,不是吗? @j_kubik:他可能认为他正在链接到 Gdi32.lib,但实际上遇到了问题,但实际上并没有链接到它。 coredll.lib 也一样(我也相信它是默认的)。但现实是,如果他实际上正确链接到这些库,他就不会收到这些链接器错误。 这就是为什么我问他实际使用的链接命令 - 这应该可以揭示他实际在做什么。 我看不到 Eclipse 使用的整个命令;我使用 -I 选项(“库 (-I)”)添加了该部分的路径。我之前只使用 -L 区域中的目录(“库搜索路径(-L)”)进行了尝试。我尝试使用引号、不带引号以及在适用的情况下使用/不使用转义空格。 我不了解 Eclipse,但如果它不允许您查看它在底层实际执行的操作,那将是非常不友好的用户体验。【参考方案2】:

我有同样的问题,但我使用 sublime text 构建。 所以我遇到了 Sublime 构建系统,我从 c++ .sublime-packages 复制并粘贴了 .json 构建,然后我创建了新的构建系统, 然后我在行尾添加 -lgdi32。

如果我按 F7 或 Ctrl + B 并且工作正常!

构建 json 代码

json的代码是这样的!


    "shell_cmd": "g++ \"$file\" -o \"$file_path/$file_base_name\" -lgdi32",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "$file_path",
    "selector": "source.c++",

    "variants":
    [
        
            "name": "Run",
            "shell_cmd": "g++ \"$file\" -o \"$file_path/$file_base_name\" -lgdi32 && \"$file_path/$file_base_name\""
        
    ]

【讨论】:

【参考方案3】:

如果您收到错误 undefined reference 到 gdi32 中定义的函数但已经链接 gdi32,请尝试将 gdi32 移动到链接命令的末尾。

【讨论】:

以上是关于未定义对 CreateCompatibleDC、BitBlt 等的引用?的主要内容,如果未能解决你的问题,请参考以下文章

Python win32ui.error:CreateCompatibleDC 失败

CreateCompatibleDC() 是不是需要在一个显示器上使用窗口?

VC中怎么用多线程画图,不显示画图过程啊,我是新手

C语言里面对啥未定义引用是啥意思?

理解JavaScript未定义变量

jqgrid 中的“未定义”消息,“b.jgrid.formatter 未定义”