1

mingw を使用して Linux から Windows にクロスコンパイルするときの文字エンコーディング/変換の問題をどのように処理すればよいですか?


Windows ターゲット用に Linux システムで 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*コード内で を置き換えることで、この 1 つのエラーを回避できましたLPSTRが、別のエラーに遭遇しました。文字エンコーディングの問題に直面していることは明らかです。変換を適切に処理するコンパイラ オプションがいくつかあるのではないかと想像していますが (私は を見ていましたfexec-charset)、問題についてはよくわかりません。などはMicrosoftのtypedefであることは理解してLPSTRいますが、LinuxからWindowsターゲット用にクロスコンパイルする場合、mingwはそれらをどのように処理する必要がありますか?

ありがとう!


これは、qmake/project.cpp からの問題のあるコード行です。

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

どうやら が必要なときに にGetComputerName展開されているマクロのようです。GetComputerNameAGetComputerNameW

4

3 に答える 3

4

デフォルトでは、ほとんどすべてのWindows API関数(eg )は、ワイド文字のバリアント(eg)ではGetComputerNameなく、ANSI実装(eg)に解決されます。GetComputerNameAGetComputerNameW

#define UNICODEの前に試す#include <windows.h>か、マクロを引数としてコンパイラに渡します。

詳細については、これこれを参照してください。

于 2012-06-07T13:09:35.613 に答える
1

WINAPI 関数のワイド バージョンを使用する必要があります: becomeGetComputerNameAなどGetComputerNameW

Unicode バージョン (別名「ワイド」) には接尾辞 a が付きますがW、ANSI バージョンには接尾辞A. これらはそれぞれLPWSTRおよびLPSTR文字列引数として受け入れます (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 に答える