未定义对“__imp_CreateSolidBrush”的引用

undefined reference to `__imp_CreateSolidBrush'

提问人:Shogery 提问时间:9/16/2022 最后编辑:Shogery 更新时间:9/17/2022 访问量:807

问:

尝试使用 CreateSolidBrush 更改窗口背景颜色。 我已经包含了 wingdi.h,我相信我已经链接了 gdi32.lib(但是我使用 LIB32A 将 gdi32.lib 转换为 gdi2.a,我想知道这是否可能是一个问题?

我不介意使用其他功能,但我担心如果我找不到解决方案,这可能会再次出现问题。

一些相关代码:

#include <stdio.h> 
#include <windows.h>
#include <wingdi.h>

#include <main.h>

DWORD CreateMainWindow(void)
{
    .............

    WNDCLASSEXA WindowClass = { 0 };

    WindowClass.hbrBackground = CreateSolidBrush(RGB(200, 200, 200));

    .............
}

我使用一个函数轻松编译

int Compile()
{
        ................

        int result = 0;

        char *include = "C:\\Users\\Coding\\C\\src\\include";
        char *link = "C:\\Users\\Coding\\C\\src\\lib";
        char command[256];
        
        if(snprintf(
            command,
            sizeof(command), 
            "gcc -o main -I%s  -l gdi32 -L%s main.c", include, link) >= sizeof(command))
        {
            //exception catching and handling
        }               
        else
        {
            system(command);
        }

        return result;
}

我没有理由相信文件没有被链接,因为我没有收到错误。

此外,我只使用 Notepad++、mingw64 和命令提示符。

C Windows 链接 器错误未 定义引用

评论

0赞 user253751 9/16/2022
缺少 gdi32.lib。转换的东西似乎不起作用
0赞 Craig Estey 9/16/2022
我不确定你为什么要换成.请参见:stackoverflow.com/questions/2337949/...值得注意的是,可能是链接/引用,转换为可能是一个问题。您可能希望将选项放在选项之前。但是,通常会查找而不是 [where is one of: lib, a, or dll]。要进行调试,您可能希望删除 and just do full path:gdi32.libgdi32.agdi32.libgdi32.dllgdi32.a-L-l-lgdi32libgdi32.Xgdi32.XX-L/-l/path_to_lib/gdi32.X
0赞 Anders 9/16/2022
为什么 GetLastError 会起作用,您是否以相同的方式转换它?
0赞 Shogery 9/16/2022
我更改为仅包含Gdi32.Lib的路径以及libgdi32.a的路径,但仍然没有收到对CreateSolidBrush的引用
0赞 Shogery 9/16/2022
@Anders为了便于阅读,缺少了很多代码。我会删除它,因为它无关紧要

答:

0赞 Brecht Sanders 9/17/2022 #1

该错误是链接器错误,因为它找不到共享库符号。CreateSolidBrush

所需要的只是链接器标志,因此它与 MinGW 的 .-lgdi32libgdi32.a

不要尝试通过从您找到的其他文件转换来生成此文件,该文件可能是使用完全不同的编译器构建的。如果您已经尝试过,请确保清除之前尝试中任何挥之不去的 gdi32 或文件。.a.lib

评论

0赞 Shogery 9/17/2022
因此,我尝试将system32中的gdi32.dll副本和窗口工具包中的Gdi32.lib副本组合在一起,因为这是Lib2a程序,lib及其相应的dll所需的。不过,我完全没有意识到 MinGW 有自己的 gdi32,希望这将是我一直在逃避的解决方案
0赞 Shogery 9/17/2022
...不好,仍然收到未定义的引用,包括刚刚手动输入命令提示符时。我知道这是一个链接器问题,但由于某种原因,该函数仍然没有链接
1赞 Shogery 9/17/2022 #2

答案非常简单,链接和包含必须在文件之后。


C:\User> gcc main.c -lgdi32 -I<include path> -o main

如果这很明显,那么我道歉,希望这对另一个困惑的人有所帮助