gpt4 book ai didi

c - Mingw -mconsole 选项导致 MS GUI 函数的 undefined reference 出现链接错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:56 24 4
gpt4 key购买 nike

有人多次告诉我,mingw 的 -mwindows-mconsole 命令行开关实际上只影响 EXE header 中的一个位,而且不会太大很多其他的。然而,这似乎不是真的。如果我尝试在我的项目中使用 -mconsole,我会在链接时收到以下错误:

../../build/objs/t-win32-ep128-xep128--gui.o:gui.c:(.text+0xb3): undefined reference to `_imp__GetOpenFileNameA@4'
../../build/objs/t-win32-ep128-xep128--gui.o:gui.c:(.text+0xc7): undefined reference to `_imp__CommDlgExtendedError@0'

OK,我想,GUI相关的选项不能和-mconsole一起使用的问题。然而,这对我来说是一个陷阱,因为我需要编写一个应用程序,它使用像 GetOpenFileName() 这样的函数,但它仍然需要控制台,因为我在那里用 printf()< 编写调试消息 等等。此外,它似乎与 -mconsole/-mwindows 开关仅影响单个 EXE header 元素的“常识”观点相冲突,因此 Windows 将知道分配控制台或不适合申请。是的,我可以自己分配一个控制台,但这很难看,因为我想使用程序启动的控制台。在这种情况下,解决方案是什么?谢谢。

最佳答案

-mwindows-mconsole 真的 只设置一个标志来确定 Windows 应用程序的类型。如果您未指定任何内容,则默认为 console .

也就是说,默认链接选项可能因库自动链接到的内容而异。例如。对于 GetOpenFileName() ,您需要链接到 comdlg32 .以下示例按预期工作:

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

int main(void)
{
OPENFILENAMEA ofn = {sizeof(ofn)};
char filename[1024] = {0};
ofn.lpstrFile = filename;
ofn.nMaxFile = 1024;

GetOpenFileNameA(&ofn);

printf("selected: %s\n", filename);

return 0;
}

输出:

$ gcc -oopendemo opendemo.c -lcomdlg32
$ ./opendemo.exe
selected: C:\temp\winsdksetup.exe

在没有任何库且没有 -mwindows 的情况下进行链接时,检查我的 mingw gcc 的行为,它添加了以下库:

-lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt

-mwindows ,列表如下所示:

-lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -lgdi32 -lcomdlg32 -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt

所以,确实,gdi32comdlg32自动添加 -mwindows ,可能是因为许多 GUI 程序需要它们。

关于c - Mingw -mconsole 选项导致 MS GUI 函数的 undefined reference 出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44760490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com