【问题标题】:wWinmain, Unicode, and MingwwWinmain、Unicode 和 Mingw
【发布时间】:2011-04-04 00:43:03
【问题描述】:

我正在学习 Windows API,并使用 mingw 作为我的编译器,使用 Code::Blocks 作为我的 IDE。我在使用 wWinMain 函数时遇到了问题。我使用了位于link text 的程序。它在 VSC++ 2008 express 上编译得很好,但是在使用 mingw 时我得到“未定义对 WinMain@16 的引用”错误。我已经弄清楚问题是什么(我认为)。通过仅将 wWinMain 替换为 Winmain 并将字符串指针 PWSTR 替换为 LPSTR,它可以完美地编译。我的问题是,我该如何解决这个问题,如果没有,那么使用 Unicode 是不是很重要。

谢谢。

【问题讨论】:

    标签: c++ mingw


    【解决方案1】:

    对于旧版本的 MinGW,您可以使用包装器:

    mingw-unicode-main:

    https://github.com/coderforlife/mingw-unicode-main/

    在 MinGW 中添加 wmain 和 wWinMain 支持的简单包装器

    这些包装器允许在 MinGW 中无缝使用 wmain / wWinMain 使用 Unicode (WCHAR)、常规 (CHAR) 或能够选择 (TCHAR)。

    使用它们的说明在文件中。也看看 其他使用它们的程序。


    对于新版本的 MinGW,您应该使用 -municode 选项,就像 mingw-unicode-main 自述文件中所述:

    注意:这不应该再被使用,因为 MinGW 现在有一个内置的 解决方案。将 -municode 添加到命令行(可能还有 extern "C" 到 wmain 函数)。

    -municode 选项适用于 MinGW-w64。在 2012-07 年,当我尝试 MinGW 时,它没有 -municode 选项。

    MinGW-w64 的安装方法如下:

    目标 Win32:

    目标 Win64:


    Unicode 相关问题:

    【讨论】:

    • 可能值得添加 -municode 是一个链接器设置
    • @Marc.2377 你是对的,该选项属于链接步骤。许多构建系统使用 g++ 编译器作为链接器进行 C++ 构建,因为它比正确驱动 ld 稍微容易一些。当我自己使用 CMake (target_link_options) 尝试此选项时,错误消息来自 c++
    【解决方案2】:

    使用普通(非 unicode)WinMain 函数,然后使用 GetCommandLineW 获取您的 unicode 命令行。 MinGW 不知道wWinMain

    您可能会发现在 MinGW 上工作很困难; last time I used it it did not support most of the wchar_t components of the C++ standard library (i.e. std::wifstream, std::wstring, etc) 这使得与 Unicode Windows 位的接口变得困难。

    你有什么反对 MSVC 的吗?

    【讨论】:

    • 我对 MSVC 没有任何反对意见,只是我认为无法发布您使用 express 版本制作的软件。尽管我离那一点还有很长的路要走,但我希望能够合法地做到这一点。
    • @JAKE:对于您可以使用 MSVC Express Editions 构建的软件类型没有任何限制。完整版和快速版之间的唯一区别是完整版具有显着更多功能,例如能够安装 MSVC 插件(即 Visual Assist X)。但对编译后的代码没有任何限制——它无论如何都不是来自 Visual Studio,而是来自 Windows SDK。
    • 哦,显示我所知道的,谢谢,我想我可能会开始使用VS。
    • 现在有了 VS 社区版(它取代了 Express 版),与商业版的差别就更小了。事实上,社区版的功能与专业版相当(我相信从 VS 2015 开始)。区别仅在于如何使用许可证。
    【解决方案3】:

    我知道我应该发表评论而不是回答,但我没有足够的声誉。

    我想补充一点,我必须在 [Settings > Compiler... > Toolchain Executables > Program Files] 中更改指向 exe 文件的链接,才能运行 Community 版本。

    我 2016 年的 CodeBlocks 也声称它是 Unicode,但 -municode 选项不起作用,只有社区对版本的 MiniGW 更新起作用。

    如果你想再次使用 main 而不是 wmain,你必须删除 -municode 选项。

    【讨论】:

    • 社区的版本”还是“ 社区的版本”?你两样都说。两者是完全不同的东西。一种表示“@zett42 推荐的 Community 版本的 Visual Studio”。另一个意思是“@Community编辑的answer中推荐的MinGW-W64版本的MinGW(相对于TDM-GCC)”。有根据的猜测是不可能的,因为在此线程的上下文中这两种含义都具有同等意义。
    • 我以为 2012_07_29 的“XP1”的答案是“社区”,但现在我了解到“社区”是一个机器人,只是对其进行了编辑。在这里,我重复他帖子中的链接:sourceforge.net/projects/mingw-w64/files/… 我拿了 4.7.2 版。
    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 2010-12-20
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多