2012-06-07 107 views
1

如何在使用mingw從Linux到Windows交叉編譯時處理字符編碼/轉換問題?從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之類是微軟的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

默認情況下,幾乎所有Windows API函數(例如GetComputerName)都將解析爲ANSI實現(例如GetComputerNameA),而不是它們的寬字符變體(例如GetComputerNameW)。

#include <windows.h>之前嘗試#define UNICODE或將宏作爲參數傳遞給編譯器。

欲瞭解更多信息,請參閱thisthis

+0

兩者都有效,但我最終將其設置爲配置選項。現在我還有其他一些錯誤,但這個似乎已經解決了。謝謝。 –

+0

@Ilian Pinzon嗨,你能告訴我把'#define UNICODE'放在哪裏嗎?我正在編譯窗口上的(源Qt5.2.1)。我得到了同樣的錯誤 'project.cpp:在成員函數'QStringList&QMakeProject :: values(const QString&,QMap &)':' – user628298

1

您需要使用寬版的WINAPI功能:GetComputerNameA成爲GetComputerNameW

的Unicode版本(也稱爲「寬」)的W,而ANSI版本與一個A後綴爲後綴。它們分別接受LPWSTRLPSTR作爲字符串參數(LPWSTR是wchar_t *的別名)。

還有宏擴展到一個或另一個取決於您的unicode配置。有關示例,請參見msdn的文檔:GetComputerName

+0

嗯,我沒有讀過,但我試圖編譯Qt庫。爲什麼我需要修改代碼?我應該不能按原樣編譯?清楚的是,我正在編譯Qt的開源庫 - 爲所有平臺打包的版本。 –

+0

是的,它明確地應該立即編譯。但是,您正在交叉編譯,並且可能爲Windows mingw安裝量身定製源代碼。如果這是一個選項,我會用葡萄酒下的香草窗口安裝來構建它。 – slaphappy

1

您配置錯誤的Qt。

一個正確配置的Qt版本增加了-DUNICODE -D_UNICODE(在很多其他事情中)可以補救您遇到的問題。

交叉編譯Qt不是一件有趣的事情,也不容易做到正確。

+0

有趣的是,我只注意到我一直在使用qmake.conf一直包括一行:「DEFINES = UNICODE ...」。將'-DUNICODE'添加到configure命令行似乎沒有任何作用。我可以通過定義'CFLAGS = -DUNICODE'來實現它。 –