8P by neo 3달전 | favorite | 댓글 7개
  • C++에서 GUI 작성용 라이브러리를 검색하고 비교한 결과 정리
  • 기본 요구사항 : 윈도우 지원만 필요, 상업적 사용 가능, 다크모드 포함 쉬운 스타일링, 최소 종속성의 40MB 미만 단일 EXE 생성, 빠른 개발

WinUI 3

  • 처음에는 훌륭한 선택처럼 보임
  • 현대적인 Windows 구성 요소를 사용할 수 있고 스타일 색상을 사용자 정의할 수 있음
  • XAML을 사용하여 디자인할 수 있고 Visual Studio 디자이너를 직접 사용할 수도 있음
  • 문제:
    • 패키징되지 않은 형태로 앱을 제공하는 것은 잘 지원되지 않음
    • 앱을 VM이나 다른 컴퓨터로 이동할 때 대부분 실행에 실패함
    • WinUI 기능을 처리하는 많은 .dll 파일을 제공해야 함
    • 단일 포터블 .exe 파일을 만들 수 없음
    • 패키지 형태로 사용 시 문제 없음, 하지만 AppX 패키지로 설치되어 Win32 API 접근 문제 발생

Win32 / MFC / Win32를 래핑하는 작은 라이브러리

  • 높은 이식성이 필요하므로 OS의 기본 렌더링을 사용하는 것이 합리적임
  • 프로그램은 단일 .exe 파일이 될 수 있고 크기도 매우 작을 수 있음(MFC 정적 링크 시)
  • 누군가 이미 작성한 보다 최소한의 라이브러리를 사용할 수 있음
  • 문제:
    • 기본 Win32 컨트롤을 스타일화하는 것은 매우 어려움
    • 모든 컨트롤에 대해 사용자 정의 페인트 기능을 작성해야 함
    • 윈도우 파일 탐색기에서 사용되는 "숨겨진" 다크 모드가 있지만 일부 컨트롤만 포함하고 여전히 잘 보이지 않음

Qt

  • C++ GUI의 성배
  • 복잡하지만 Qt Style Sheets를 사용하여 쉽게 스타일을 지정할 수 있음
  • 문제:
    • 동적으로 연결할 때 앱을 실행하는 데 필요한 수많은 .dll이 있으며 크기가 40MB 이상임
    • Qt를 프로그램에 정적으로 연결할 수 있지만 오픈 소스로 만들거나 Qt의 LGPL 라이선스로 인해 재컴파일할 오브젝트 파일을 배포해야 함
    • 또는 상용 라이선스를 구매할 수 있으나 수천 달러

wxWidgets

  • 배우기 쉬운 라이브러리
  • wxFormBuilder를 사용할 수 있음
  • Qt보다 더 허용적인 라이선스를 가지고 있으며 3MB 실행 파일에 정적으로 연결될 수 있음
  • 문제:
    • Windows에서는 기본 Win32 구성 요소를 사용하며 스타일링 옵션을 제공하지 않음
    • Windows 파일 탐색기 다크 컨트롤 적용을 지원하지만 별로 좋지 않음

hikogui

  • Vulkan을 백엔드로 사용하는 새로운 retained mode GUI 라이브러리
  • 내장 다크 모드가 있고 스타일을 쉽게 지정할 수 있음
  • 문제:
    • 성공적으로 컴파일하려면 컴퓨터 과학 박사 학위가 필요함
    • 30분 이상 예제를 컴파일하려고 시도한 후 Vulkan 라이브러리 내부에서 액세스 위반으로 즉시 충돌하는 실행 파일만 얻었음

Sciter

  • HTML/CSS를 사용하여 데스크톱 앱용 GUI를 작성할 수 있는 Electron의 좋은 대안
  • 문제:
    • 최종 앱이 모든 .dll과 함께 약 25MB 정도 되는 크기가 문제가 될 것 같지만 괜찮음
    • 오픈 소스이고 상용으로 정적 링크 버전을 사용할 수 있다면 더 좋을 것임
    • Qt처럼 비싸지 않아서 ($310) 돈을 내고 행복할 것임
    • 문제는 렌더링이 그다지 좋지 않다는 것
    • 글꼴과 이미지의 앨리어싱 문제가 있었음
    • 창에는 사용자 정의하거나 수정할 수 없는 꽤 두꺼운(2-3px) 회색 프레임이 있음

WinForms / WPF

  • C++ GUI 라이브러리에 대해 물어보면 대부분 다른 스택을 사용하라고 권장
    • C++은 나쁜 생각이므로 프로그램의 프런트엔드를 다른 스택으로 작성하고 C++로 작성된 기능을 구성 요소/모듈로 로드하라고 말함
  • 단일 .exe 파일을 작은 크기로 가질 수 있고 WinForms/WPF를 사용할 수 있음
  • .dll을 앱에 리소스로 번들링하고 임시 폴더에 추출하도록 한 다음 P/Invoke를 사용하고 C#/.NET 앱 내에서 컴파일된 .dll을 호출하거나 C++/CLI를 사용하면 됨
  • 문제:
    • .NET 프레임워크는 Windows 10 이상에 사전 설치되어 있으므로 기술적으로 종속성 없음 기준을 충족함
      • .dll을 번들링하면 어딘가에 추출되어야 하고 P/Invoke가 작동하기 위해 추가 코드를 작성해야 함
      • C++/CLI는 .NET IL 코드로 컴파일되어 C#으로 번역된 C++ 코드가 보임

해결책?

  • 간단한 앱의 경우 Dear ImGui보다 더 적합한 것은 없다고 생각함
  • 복잡한 UI를 설계할 때 주로 단점이 있고, retained mode UI가 아니라 immediate mode UI이므로 UI를 위해 초당 60프레임 이상을 렌더링하기 위해 DirectX와 같은 GPU 렌더러를 실행해야 함
  • 그러나 다른 모든 점에서는 일치함
  • 컴파일된 프로그램은 크기가 500KB에 불과하며 VC++ 재배포 가능 파일을 설치할 필요가 없음

GN⁺의 의견

  • 글쓴이가 말한 대로 GUI 앱 개발을 위한 완벽한 라이브러리는 없는 것 같음. 요구사항에 따라 trade-off가 있음
  • 간단한 앱의 경우 Dear ImGui가 가장 적합해 보이지만, 복잡한 UI를 만들려면 retained mode GUI 툴킷을 사용하는 것이 더 나을 것임
  • 상용 앱을 만들려면 라이선스 비용이 중요한 고려사항이 될 수 있음. Qt와 같은 라이브러리는 비용이 높지만 wxWidgets는 무료로 사용할 수 있음
  • C++로 GUI 앱을 만드는 것은 쉽지 않은 일이므로, C#이나 다른 언어로 프론트엔드를 개발하고 C++로 성능 집약적인 부분만 구현하는 것이 더 현실적일 수 있음
  • Windows에서 네이티브 look-and-feel을 원한다면 WinUI나 MFC를 사용하는 것이 좋겠지만, 크로스 플랫폼 지원이 필요하다면 Qt나 wxWidgets가 더 나은 선택이 될 수 있음

"컴파일 성공하려면 컴퓨터 과학 박사 학위 필요"
ㅋㅋㅋ

hikogui 무서운 존재군요 ㄷㄷㄷ

Sciter 및 Electron과 비교한다면 Flutter Windows Desktop Bulid도 고려해볼만합니다. 간혹버그들이 있는 플러그인들이 있지만 기본은 충실하여 전달 매개로 활용시에는 가능합니다.
싱글톤 인스턴스,자동업데이트,상태바,윈도우노티,빠른 런칭타임, Dart언어,Win32API Plugin 등등

Hacker News 의견
  • 많은 댓글을 읽으면서 전체 전제가 잘못되었음을 깨달음. 블로그 게시물을 "요구 사항이 비현실적일 때 Windows용 GUI 앱 작성은 고통스러움"으로 이름을 바꾸는 것이 좋겠음
  • .NET Framework 3.5를 사용하여 WinForms를 타겟으로 하는 것이 좋겠음. 최신 Windows 버전에는 모두 설치되어 있음
  • 이 글은 여러 옵션에 대한 좋은 개요를 제공하지만, 저자의 특정 요구 사항이 많은 옵션을 배제하게 만듦
    • 완전히 사용자 정의된 GUI 스타일링을 원하면서 자체 렌더링 함수를 작성하지 않으려는 요구 사항은 쉬운 사용자 정의 GUI 라이브러리를 선택하는 작업이 됨
    • 자체 포함 실행 파일과 40MB 이하의 크기 제한 요구 사항도 많은 옵션을 배제함. Qt는 이러한 요구 사항을 충족할 수 있었지만 오픈 소스 라이선스가 목표와 맞지 않았고 라이선스를 구매하기 싫어했음
    • 종속성을 허용하거나 더 큰 다운로드 크기를 허용하거나 내장된 Windows GUI 컨트롤을 사용하는 경우 상황이 매우 다름
    • 외부 종속성 없이 가벼운 완전 사용자 정의 GUI를 작성하고 허용적인 라이선스를 원한다면 ImGui가 답이 될 것이라고 예상했음
  • WinForms/WPF 아이디어에 큰 결함이 없음을 지적하지만, 두 개의 스택을 요구하는 것 외에는 언급하지 않음. 네이티브 코드를 원하고 C#이 보이지 않기를 원하지만 이유를 설명하지 않음. 역공학에 대한 두려움일 수 있음. UI 코드는 비밀을 포함하는 경우가 드뭄
    • 단일 exe 배포는 때때로 편리하지만, 이 시나리오에서는 번거로울 수 있음. Velopack(스퀴럴)과 같은 패키저를 사용하면 단일 exe로 배포할 수 있으며 자동 업데이트 기능도 추가됨. 설치 시 디스크에 두 개 이상의 파일이 있는 것은 좋은 타협임
    • Windows는 다른 모든 플랫폼을 제외하고 데스크탑 앱을 개발하기에 최악의 플랫폼임
  • LGPL 라이선스 소프트웨어 라이브러리에 대한 상업적 라이선스 비용을 지불해야 한다고 비난하는 개발자에 대해 매우 낮은 의견을 가짐. 그들은 자신의 작업에 대해 보상을 받기를 기대하며, 폐쇄 소스 소프트웨어를 만들어 이를 보장함. 그러나 UI 라이브러리를 만드는 실제 어려운 부분을 해결한 개발자는 세상에 코드를 자유롭게 선물하는 성인이 되어야 함
  • Sciter와 "안티앨리어싱" 문제에 대해... 저자는 애플리케이션에서 고해상도 DPI 지원을 활성화하지 않았음
    • Visual Studio에서 활성화하거나 적절한 매니페스트를 포함하여 해결할 수 있음
    • "Hello C++" 튜토리얼에서 설명됨
  • 더 정확하게:
    • "포터블" (자동 압축 해제 없이 단일 exe)
    • 상업적이고 컴파일된 객체 파일을 재배포하지 않으려 함 (이는 "포터블" 요구 사항과 함께 LGPL을 허용하지 않음)
    • 다크 모드
    • Windows GUI 앱은 고통스러움. 이 요구 사항 중 하나를 제거하면 좋은 옵션이 많음
    • 대부분의 "포터블" 애플리케이션은 win32를 사용함. 보통 포터블은 작고 단순한 애플리케이션으로 기능이 다크 모드나 다른 스타일링 능력보다 중요함
  • 다른 사람들의 오픈 소스에 많은 것을 요구하는 사람으로서, 저자는 자신의 솔루션을 오픈 소스로 공개하려 하지 않음
  • 나는 요구 사항에 맞는 GUI 툴킷을 작업 중임: Slint - https://slint.dev
    • 단일 .exe로 정적으로 컴파일될 수 있으며 크기가 40M보다 작음. 데스크탑에서 무료로 사용할 수 있는 라이선스를 가짐. 다크/라이트 스타일을 제공함. (작업 중인) 드래그 앤 드롭 WYSIWYG 편집기도 포함됨
  • 모든 컨트롤에 대해 사용자 정의 페인트 함수를 작성해야 한다는 것은 오래된 win32 철학이 저자에게 맞지 않음을 보여줌. win32의 핵심 요소는 wndproc임. 대부분의 컨트롤은 부모에게 색상을 물어봄
    • 불편하다면, 작은 라이브러리로 래핑하여 보일러 플레이트를 제거하는 것은 큰 문제가 아님
  • 결과는 종속성이 없거나 최소한의 종속성을 가진 단일 .exe 파일이어야 하며 크기는 40MB 미만이어야 함
    • 컴퓨터에는 이제 현대적인 브라우저가 있음. .exe 파일 대신 단일 .html 파일에 인라인된 이미지/css/javascript를 사용할 수 있음