提问人:Shogery 提问时间:9/16/2022 最后编辑:Shogery 更新时间:9/17/2022 访问量:807
未定义对“__imp_CreateSolidBrush”的引用
undefined reference to `__imp_CreateSolidBrush'
问:
尝试使用 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 和命令提示符。
答:
0赞
Brecht Sanders
9/17/2022
#1
该错误是链接器错误,因为它找不到共享库符号。CreateSolidBrush
所需要的只是链接器标志,因此它与 MinGW 的 .-lgdi32
libgdi32.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
如果这很明显,那么我道歉,希望这对另一个困惑的人有所帮助
上一个:.so 中未定义的符号
评论
gdi32.lib
gdi32.a
gdi32.lib
gdi32.dll
gdi32.a
-L
-l
-lgdi32
libgdi32.X
gdi32.X
X
-L/-l
/path_to_lib/gdi32.X