MSVC 2022로 Qt 6.6.1버전 빌드 시 발생하는 오류 리스트
- 소스코드 파일 인코딩 오류 (비 유니코드 언어가 영어 (미국)이 아닌경우)
- qtwebengine/src/3rdparty/gn/src/gn/variables.cc 텍스트 오류 (1번 항목과 동일한 환경, 577번 라인의 0xA0(NBSP) 캐릭터에서 에러 발생하며 0x20(SPACE)으로 변경하면 해결)
- qtwebengine/src/3rdparty/chromium/third_party/webrtc/rtc_base/checks.h LogStreamer의 연산자 오류
- gperf 버전이 3.1이상일 경우 오류 발생 ((standard input):1915: warning: junk after %% is ignored 메시지 발생하며 파일이 정상처리 안됨)
크게 네가지 오류가 나타난다. 이 중 1, 2번은 이 글에서 “지역설정” 항목을 참조하여 변경하면 해결 된다. 3번 항목은 vcpkg 프로젝트에서 qtwebengine 패키지의 패치(clang-cl.patch, msvc-template.patch)를 그대로 적용하면 해결된다. 4번은 Qt 5.15.x 버전을 다운받은 후 gnuwin32\bin 경로를 PATH의 맨 앞으로 추가하여 clean & build 하면 해결된다.
만약 시스템 로케일 변경이 귀찮거나 재부팅을 하기에 곤란하다면 아래 소스코드를 빌드 후 실행하여 UTF-8 BOM을 추가하고 환경변수에 “PYTHONUTF8=1″을 추가(프롬프트에서 SET PYTHONUTF8=1
실행)하여 파이선의 파일 인코딩을 UTF-8로 인식하도록 설정한다.
아래 코드는 NBSP문자를 SPACE로 변환 및 확장 아스키 영역의 문자가 있을 경우 UTF-8 BOM을 추가한다.
/*
* 파일명: CSourceSetUtf8Bom.cpp
* 빌드명령: cl CSourceSetUtf8Bom.cpp /O2 /std:c++20 /EHsc
* 실행: CSourceSetUtf8Bom <qt source path>
* 실행 예: CSourceSetUtf8Bom D:\OpenSource\Qt6.6.1.src
*/
#include <algorithm>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <string>
static void fetch(const std::filesystem::path& source_path, std::size_t& count)
{
std::cout << count << "\r";
std::filesystem::directory_iterator it(source_path);
for (; it != std::filesystem::end(it); it++)
{
if (std::filesystem::is_directory(*it))
{
fetch(*it, count);
}
else
{
std::string path = it->path().string();
if (!path.ends_with(".c") && !path.ends_with(".cc") && !path.ends_with(".cpp") && !path.ends_with(".h"))
//if (!path.ends_with(".py"))
{
continue;
}
count++;
std::basic_ifstream<unsigned char> istream(path);
std::basic_string<unsigned char> content((std::istreambuf_iterator<unsigned char>(istream)), std::istreambuf_iterator<unsigned char>());
istream.close();
if (content.size() >= 3 && content[0] == 0xEF && content[1] == 0xBB && content[2] == 0xBF)
{
continue;
}
bool extended = std::find_if(content.begin(), content.end(), [](unsigned char c) { return c > 127; }) != content.end();
if (!extended)
{
continue;
}
std::cout << count << ", " << it->path().string() << ", " << content.size() << " bytes\n";
// replace NBSP -> SPACE
std::replace(content.begin(), content.end(), 0xA0, 0x20);
std::basic_ofstream<unsigned char> ofstream(path);
ofstream << static_cast<unsigned char>(0xEF);
ofstream << static_cast<unsigned char>(0xBB);
ofstream << static_cast<unsigned char>(0xBF);
ofstream << content;
ofstream.close();
}
}
}
int main(int argc, char* argv[])
{
if (argc < 2)
{
std::cout << argv[0] << " <FOLDER>\n";
return EXIT_FAILURE;
}
std::size_t count = 0;
std::filesystem::path source_root(argv[1]);
if (!std::filesystem::is_directory(source_root))
{
return EXIT_FAILURE;
}
fetch(source_root, count);
return EXIT_SUCCESS;
}