从 Linux 到 Windows 交叉编译时,我应该如何处理字符编码
How should I handle character encoding when cross-compiling from Linux to Windows?
使用 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
。它们分别接受LPWSTR
和LPSTR
作为字符串参数(LPWSTR 是 wchar_t* 的别名)。
还有一些宏会根据您的 unicode 配置扩展到一个或另一个。有关示例,请参阅 msdn 的文档:GetComputerName。
你错误地配置了Qt。
正确配置的Qt构建增加了-DUNICODE -D_UNICODE
(以及其他许多东西),可以解决您遇到的问题。
交叉编译Qt不是一件有趣的事情,也不容易正确完成。
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- 在简单的外壳中进行批处理处理