1

使用 mingw 从 Linux 交叉编译到 Windows 时,我应该如何处理字符编码/转换问题?


我正在尝试在 Linux 系统上为 Windows 目标交叉编译 Qt 项目。我已经安装(我相信是)所有必需的 mingw 包,并且我认为我的环境配置正确。但是,当我尝试配置 Qt 库时,尝试编译时失败project.cpp

project.cpp: In member function 'QStringList& QMakeProject::values(const QString&, QMap<QString, QStringList>&)':
project.cpp:3062:51: error: cannot convert 'wchar_t*' to 'LPSTR {aka char*}' for argument '1' to 'WINBOOL GetComputerNameA(LPSTR, LPDWORD)'
gmake: *** [project.o] Error 1

wchar_t*我可以通过在代码中替换为来解决这个错误LPSTR,但后来我又遇到了另一个错误。很明显,我现在面临字符编码问题。我想象可能有一些编译器选项可以正确处理转换(我正在查看fexec-charset),但我什至不确定这个问题。我知道这LPSTR和类似的东西是 Microsoft typedef,但是当从 Linux 为 Windows 目标交叉编译时,mingw 应该如何处理它们?

谢谢!


以下是 qmake/project.cpp 中的违规代码行:

DWORD name_length = 1024;
wchar_t name[1024];
if (GetComputerName(name, &name_length))
    ret = QString::fromWCharArray(name);

它似乎GetComputerName是一个正在扩展的宏GetComputerNameA,当我显然需要时GetComputerNameW

4

3 回答 3

4

默认情况下,几乎所有 Windows API 函数(例如GetComputerName)都将解析为 ANSI 实现(例如GetComputerNameA),而不是它们的宽字符变体(例如GetComputerNameW)。

#define UNICODE在您之前尝试#include <windows.h>或将宏作为参数传递给您的编译器。

有关更多信息,请参阅thisthis

于 2012-06-07T13:09:35.613 回答
1

您需要使用宽版本的 WINAPI 函数:GetComputerNameA成为GetComputerNameW等。

Unicode 版本(又名“宽”)以 a 为后缀,W而 ANSI 版本以A. 它们分别接受LPWSTRLPSTR作为字符串参数(LPWSTR 是 wchar_t* 的别名)。

根据您的 unicode 配置,还有一些宏可以扩展为一个或另一个。有关示例,请参见 msdn 的文档:GetComputerName

于 2012-06-07T13:00:47.600 回答
1

你错误地配置了 Qt。

正确配置的 Qt 构建添加-DUNICODE -D_UNICODE(以及许多其他内容)可以解决您遇到的问题。

交叉编译 Qt 不是一件有趣的事,也不容易正确完成。

于 2012-06-07T17:19:55.267 回答