2012-06-07 3 views
1

mingw를 사용하여 Linux에서 Windows로 크로스 컴파일 할 때 문자 인코딩/변환 문제를 어떻게 처리해야합니까?Linux에서 Windows로 크로스 컴파일 할 때 문자 인코딩을 어떻게 처리해야합니까?


Windows 시스템 용 Linux 시스템에서 Qt 프로젝트를 크로스 컴파일하려고합니다. 나는 (필요한 것으로 생각되는) 모든 필요한 패키지를 설치했으며 내 환경이 올바르게 구성되었다고 생각한다. 나는 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 

나는 코드에서 LPSTRwchar_t*를 대체하여이 단일 오류 주위를 해킹 할 수 있었다, 그러나 나는 단지에 달렸다 또 다른 오류. 지금 나는 문자 인코딩 문제에 직면하고 있음이 분명해 보인다. 변환을 적절하게 처리 할 수있는 컴파일러 옵션이 있다고 생각합니다. (fexec-charset을보고있었습니다). 그러나이 문제에 대해서는 정말로 확신하지 못합니다. 나는 LPSTR 등이 Microsoft typedef라는 것을 알고 있지만, Windows 타겟에서 Linux에서 크로스 컴파일 할 때 어떻게 처리해야합니까?

감사합니다. 여기


는 qmake를/project.cpp에서 코드의 잘못된 줄입니다 :

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

GetComputerName 분명히 내가 GetComputerNameW을 필요로 할 때, GetComputerNameA로 확대되고있는 매크로 것 같다. GetComputerNameAGetComputerNameW이되는 등

유니 코드 버전 (일명 "와이드") ANSI 버전 반면 WA 접미사하는 접미사됩니다

답변

4

기본적으로 거의 모든 Windows API 함수 (예 : GetComputerName)는 넓은 char 변형 (예 : GetComputerNameW)이 아니라 ANSI 구현 (예 : GetComputerNameA)을 해결합니다.

#include <windows.h> 앞에 #define UNICODE을 시도하거나 매크로를 컴파일러에 인수로 전달하십시오.

자세한 내용은 thisthis을 참조하십시오.

+0

두 가지 모두 작동했지만 구성 옵션으로 설정했습니다. 이제 나는 다른 실수들을 많이 겪었지만이 문제는 해결 될 것으로 보인다. 감사. –

+0

@Ilian Pinzon 안녕하세요, '# UNICODE 정의'를 어디에 넣을 수 있는지 알려주시겠습니까? Windows에서 소스 Qt5.2.1을 컴파일 중입니다. 같은 오류가 발생했습니다. 'project.cpp : 멤버 함수에서 'QStringList & QMakeProject :: values ​​(const QString & QMap &') ':' – user628298

1

당신은 WINAPI 함수의 다양한 버전을 사용해야합니다. 각각 LPWSTRLPSTR을 문자열 인수로 사용합니다 (LPWSTR은 wchar_t *의 별명 임).

유니 코드 구성에 따라 하나 또는 다른 매크로로 확장되는 매크로도 있습니다. 예제는 GetComputerName 인 msdn 설명서를 참조하십시오.

+0

글쎄, 나는 그것을 읽었지 만 Qt 라이브러리를 컴파일하려고합니다.왜 코드를 수정해야합니까? 있는 그대로 컴파일 할 수 없습니까? 분명한 것은 Qt의 오픈 소스 라이브러리 (모든 플랫폼 용 패키지)를 컴파일하는 것입니다. –

+0

예, 그것은 분명히 out-of-the-box를 컴파일해야합니다. 그러나, 당신은 크로스 컴파일하고, 소스는 아마 윈도우 설치를 위해 맞춰져있다. 그것이 옵션이라면, 나는 바닐라 창문을 와인 아래에 설치하여 그것을 만들 것이다. – slaphappy

1

Qt가 잘못 구성되었습니다.

정확하게 구성된 Qt 빌드에는 발생한 문제를 해결하는 -DUNICODE -D_UNICODE (다른 많은 것들 중에서)이 추가됩니다.

Qt를 크로스 컴파일하는 것은 재미있는 일이 아니며 올바르게 수행하기도 쉽지 않습니다.

+0

흥미롭게도, 저는 방금 사용했던 qmake.conf 모두 함께 "DEFINES = UNICODE ..."라는 줄이 포함되었습니다. configure 커맨드 라인에'-DUNICODE'를 추가해도 아무런 효과가없는 것으로 보입니다. 나는'CFLAGS = -DUNICODE'를 정의함으로써 작동시킬 수있었습니다. –

관련 문제