Qt 6.6.1 MSVC 2022로 빌드

MSVC 2022로 Qt 6.6.1버전 빌드 시 발생하는 오류 리스트

  1. 소스코드 파일 인코딩 오류 (비 유니코드 언어가 영어 (미국)이 아닌경우)
  2. qtwebengine/src/3rdparty/gn/src/gn/variables.cc 텍스트 오류 (1번 항목과 동일한 환경, 577번 라인의 0xA0(NBSP) 캐릭터에서 에러 발생하며 0x20(SPACE)으로 변경하면 해결)
  3. qtwebengine/src/3rdparty/chromium/third_party/webrtc/rtc_base/checks.h LogStreamer의 연산자 오류
  4. 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;
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

*
*

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.