从 Linux 到 Windows 交叉编译时,我应该如何处理字符编码

How should I handle character encoding when cross-compiling from Linux to Windows?

本文关键字:何处理 处理 编码 字符 我应该 Linux Windows 交叉编译      更新时间:2023-10-16

使用 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

我能够通过在代码中用LPSTR替换wchar_t*来解决这个单一的错误,但后来我遇到了另一个错误。很明显,我现在面临着字符编码问题。我想象可能有一些编译器选项可以正确处理转换(我正在查看fexec-charset),但我什至不确定这个问题。我知道LPSTR之类的Microsoft typedefs,但是当从 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

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

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

有关详细信息,请参阅此和此内容。

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

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

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

你错误地配置了Qt。

正确配置的Qt构建增加了-DUNICODE -D_UNICODE(以及其他许多东西),可以解决您遇到的问题。

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