최신 크로스 플랫폼 GUI를 구축하기 위한 C/C++용 작은 크로스 플랫폼 웹뷰 라이브러리입니다.
이 프로젝트의 목표는 가장 널리 사용되는 플랫폼을 위한 공통 HTML5 UI 추상화 레이어를 만드는 것입니다.
양방향 JavaScript 바인딩(C/C++에서 JavaScript 호출 및 JavaScript에서 C/C++ 호출)을 지원합니다.
메모
Go에 대한 언어 바인딩이 이동되었습니다. 이 저장소에서는 버전 <= 0.1.1을 사용할 수 있습니다.
플랫폼 | 기술 |
---|---|
리눅스 | GTK, 웹킷GTK |
macOS | 코코아, 웹킷 |
윈도우 | 윈도우 API, 웹뷰2 |
최신 문서는 소스 코드에 있습니다. 문서를 개선하는 것은 지속적인 노력이며 여러분의 기여를 환영합니다.
컴파일러는 최신 버전이 필요한 플랫폼을 제외하고 최소 C++11을 지원해야 합니다.
이 프로젝트에서는 CMake 및 Ninja를 사용하며 사용자의 편의를 위해 권장되지만 라이브러리 사용에는 이러한 도구가 필요하지 않습니다.
개발 및 배포에는 GTK 및 WebKitGTK 라이브러리가 필요합니다. 설치할 패키지와 관련하여 패키지 저장소를 확인해야 합니다.
apt install libgtk-4-dev libwebkitgtk-6.0-dev
apt install libgtk-4-1 libwebkitgtk-6.0-4
apt install libgtk-3-dev libwebkit2gtk-4.1-dev
apt install libgtk-3-0 libwebkit2gtk-4.1-0
apt install libgtk-3-dev libwebkit2gtk-4.0-dev
apt install libgtk-3-0 libwebkit2gtk-4.0-37
dnf install gtk4-devel webkitgtk6.0-devel
dnf install gtk4 webkitgtk6.0
dnf install gtk3-devel webkit2gtk4.1-devel
dnf install gtk3 webkit2gtk4.1
dnf install gtk3-devel webkit2gtk4.0-devel
dnf install gtk3 webkit2gtk4.0
pkg install webkit2-gtk4
pkg install webkit2-gtk3
--cflags
및 --libs
와 함께 pkg-config
사용하여 다음 모듈 세트 중 하나에 대한 컴파일러/링커 옵션을 가져옵니다.gtk4 webkitgtk-6.0
gtk+-3.0 webkit2gtk-4.1
gtk+-3.0 webkit2gtk-4.0
dl
WebKit
dl
advapi32 ole32 shell32 shlwapi user32 version
wxallowed
옵션(mount(8) 참조)을 추가해야 할 수도 있습니다. 먼저 이 보안 기능을 비활성화하지 않고 작동하는지 확인하십시오.컴파일러는 C++14를 지원해야 하며 이를 최신 Windows 10 SDK와 페어링하는 것이 좋습니다.
Visual C++의 경우 Visual Studio 2022 이상을 권장합니다. MinGW-w64를 사용하려면 몇 가지 요구 사항이 있습니다.
개발자와 최종 사용자는 Windows 11 이전의 모든 Windows 버전에 대해 시스템에 WebView2 런타임을 설치해야 합니다.
이 프로젝트의 개발자라면 개발 섹션으로 이동하세요.
작동하는 앱을 가지게 되지만 사용 가능한 예제를 살펴보는 것이 좋습니다.
새 디렉터리에 다음 파일을 만듭니다.
.gitignore
:
# Build artifacts
/build
CMakeLists.txt
:
cmake_minimum_required ( VERSION 3.16)
project (example LANGUAGES CXX)
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /bin" )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
include (FetchContent)
FetchContent_Declare(
webview
GIT_REPOSITORY https://github.com/webview/webview
GIT_TAG 0.12.0)
FetchContent_MakeAvailable(webview)
add_executable (example WIN32 )
target_sources (example PRIVATE main.cc)
target_link_libraries (example PRIVATE webview::core)
main.cc
:
# include " webview/webview.h "
# include < iostream >
# ifdef _WIN32
int WINAPI WinMain (HINSTANCE /* hInst */ , HINSTANCE /* hPrevInst */ ,
LPSTR /* lpCmdLine */ , int /* nCmdShow */ ) {
# else
int main () {
#endif
try {
webview::webview w ( false , nullptr );
w. set_title ( " Basic Example " );
w. set_size ( 480 , 320 , WEBVIEW_HINT_NONE);
w. set_html ( " Thanks for using webview! " );
w. run ();
} catch ( const webview:: exception &e) {
std::cerr << e. what () << ' n ' ;
return 1 ;
}
return 0 ;
}
CMakeLists.txt
:
cmake_minimum_required ( VERSION 3.16)
project (example LANGUAGES C CXX)
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /bin" )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY " ${CMAKE_BINARY_DIR} /lib" )
include (FetchContent)
FetchContent_Declare(
webview
GIT_REPOSITORY https://github.com/webview/webview
GIT_TAG 0.12.0)
FetchContent_MakeAvailable(webview)
add_executable (example WIN32 )
target_sources (example PRIVATE main.c)
target_link_libraries (example PRIVATE webview::core_static)
main.c
:
# include " webview/webview.h "
# include < stddef.h >
# ifdef _WIN32
# include < windows.h >
# endif
# ifdef _WIN32
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine,
int nCmdShow) {
( void )hInst;
( void )hPrevInst;
( void )lpCmdLine;
( void )nCmdShow;
# else
int main ( void ) {
#endif
webview_t w = webview_create ( 0 , NULL );
webview_set_title (w, " Basic Example " );
webview_set_size (w, 480 , 320 , WEBVIEW_HINT_NONE);
webview_set_html (w, " Thanks for using webview! " );
webview_run (w);
webview_destroy (w);
return 0 ;
}
프로젝트를 빌드합니다.
cmake -G Ninja -B build -S . -D CMAKE_BUILD_TYPE=Release
cmake --build build
build/bin
디렉터리에서 실행 파일을 찾으세요.
CMake를 사용하여 프로젝트를 빌드할 때 융합된 라이브러리를 빌드하거나 amalgamate.py
스크립트를 직접 호출할 수 있습니다.
후자는 아래에 설명되어 있습니다.
python3 scripts/amalgamate.py --output webview_amalgamation.h core/include/webview/webview.h
스크립트 사용법은 python3 scripts/amalgamate.py --help
참조하세요.
다음은 GCC/Clang 유사 컴파일러를 직접 호출하는 예입니다. 이전 예제의 main.cc
파일을 사용합니다.
통합된 webview.h
헤더 또는 모든 개별 파일을 libs/webview
에 배치하고 MS WebView2의 WebView2.h
libs
에 배치합니다.
선택한 플랫폼에서 프로젝트를 빌드하세요.
c++ main.cc -O2 --std=c++11 -Ilibs -framework WebKit -ldl -o example
c++ main.cc -O2 --std=c++11 -Ilibs $(pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.1) -ldl -o example
c++ main.cc -O2 --std=c++14 -static -mwindows -Ilibs -ladvapi32 -lole32 -lshell32 -lshlwapi -luser32 -lversion -o example
다음 CMake 대상을 사용할 수 있습니다.
이름 | 설명 |
---|---|
webview::core | C++용 헤더. |
webview::core_shared | C용 공유 라이브러리 |
webview::core_static | C용 정적 라이브러리. |
주문형 검사 및 관련 작업을 위한 특별 대상:
이름 | 설명 |
---|---|
webview_format_check | clang-format으로 파일을 확인하세요. |
webview_reformat | clang-format으로 파일 형식을 다시 지정하세요. |
다음 부울 옵션은 webview 프로젝트를 독립형으로 빌드할 때 또는 프로젝트의 일부로 빌드할 때(예: FetchContent를 사용하여) 사용할 수 있습니다.
옵션 | 설명 |
---|---|
WEBVIEW_BUILD | 건물 활성화 |
WEBVIEW_BUILD_AMALGAMATION | 융합된 라이브러리 구축 |
WEBVIEW_BUILD_DOCS | 문서 작성 |
WEBVIEW_BUILD_EXAMPLES | 빌드 예시 |
WEBVIEW_BUILD_SHARED_LIBRARY | 공유 라이브러리 구축 |
WEBVIEW_BUILD_STATIC_LIBRARY | 정적 라이브러리 구축 |
WEBVIEW_BUILD_TESTS | 테스트 빌드 |
WEBVIEW_ENABLE_CHECKS | 확인 활성화 |
WEBVIEW_ENABLE_CLANG_FORMAT | clang 형식 활성화 |
WEBVIEW_ENABLE_CLANG_TIDY | clang-tidy 활성화 |
WEBVIEW_ENABLE_PACKAGING | 패키징 활성화 |
WEBVIEW_INSTALL_DOCS | 설명서 설치 |
WEBVIEW_INSTALL_TARGETS | 설치 대상 |
WEBVIEW_IS_CI | CI 환경 변수에 의해 초기화됨 |
WEBVIEW_PACKAGE_AMALGAMATION | 패키지 융합 라이브러리 |
WEBVIEW_PACKAGE_DOCS | 패키지 문서 |
WEBVIEW_PACKAGE_HEADERS | 패키지 헤더 |
WEBVIEW_PACKAGE_LIB | 패키지 컴파일된 라이브러리 |
WEBVIEW_STRICT_CHECKS | 검사를 엄격하게 하라 |
WEBVIEW_STRICT_CLANG_FORMAT | clang 형식 검사를 엄격하게 설정 |
WEBVIEW_STRICT_CLANG_TIDY | clang-tidy 검사를 엄격하게 설정하세요. |
WEBVIEW_USE_COMPAT_MINGW | MinGW에 호환성 도우미 사용 |
WEBVIEW_USE_STATIC_MSVC_RUNTIME | 정적 런타임 라이브러리(MSVC) 사용 |
메모
검사는 기본적으로 활성화되어 있지만 로컬 개발에서는 기본적으로 시행되지 않습니다( WEBVIEW_IS_CI
옵션으로 제어됨).
부울이 아닌 옵션:
옵션 | 설명 |
---|---|
WEBVIEW_CLANG_FORMAT_EXE | clang-format 실행 파일의 경로입니다. |
WEBVIEW_CLANG_TIDY_EXE | clang-tidy 실행 파일의 경로입니다. |
이러한 옵션은 webview CMake 패키지를 사용할 때 사용할 수 있습니다.
옵션 | 설명 |
---|---|
WEBVIEW_WEBKITGTK_API | WebKitGTK API는 6.0 , 4.1 (권장) 또는 4.0 과 인터페이스합니다. 그러면 GTK 버전도 자동으로 결정됩니다. 사용 가능한 경우 기본적으로 최신 권장 API를 사용하거나 알려지고 사용 가능한 최신 API를 사용합니다. 기능 가용성에 영향을 미칠 수 있는 API 버전 간에는 큰 차이가 있을 수 있습니다. 기능 가용성에 대한 자세한 내용은 webview API 설명서를 참조하세요. |
옵션 | 설명 |
---|---|
WEBVIEW_MSWEBVIEW2_VERSION | MS WebView2 버전(예: 1.0.1150.38 ) |
WEBVIEW_USE_BUILTIN_MSWEBVIEW2 | 내장된 MS WebView2를 사용하세요. |
이러한 옵션은 빌드를 수정하기 위해 전처리기 매크로로 지정할 수 있지만 CMake를 사용할 때는 필요하지 않습니다.
이름 | 설명 |
---|---|
WEBVIEW_API | C API 링크, 기호 가시성 및 공유 라이브러리인지 여부를 제어합니다. 기본적으로 이는 C++의 경우 inline 이고 C의 경우 extern 입니다. |
WEBVIEW_BUILD_SHARED | 공유 라이브러리 구축을 위해 WEBVIEW_API 수정합니다. |
WEBVIEW_SHARED | 공유 라이브러리를 사용하기 위해 WEBVIEW_API 수정합니다. |
WEBVIEW_STATIC | 정적 라이브러리를 구축하거나 사용하기 위해 WEBVIEW_API 수정합니다. |
이름 | 설명 |
---|---|
WEBVIEW_GTK | GTK/WebKitGTK 백엔드를 컴파일합니다. |
WEBVIEW_COCOA | Cocoa/WebKit 백엔드를 컴파일합니다. |
WEBVIEW_EDGE | Win32/WebView2 백엔드를 컴파일합니다. |
옵션 | 설명 |
---|---|
WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL | WebView2 로더의 내장 구현을 활성화( 1 )하거나 비활성화( 0 )합니다. 이를 활성화하면 WebView2Loader.dll 이 필요하지 않지만 DLL이 있는 경우 DLL이 우선순위를 갖습니다. 이 옵션은 기본적으로 활성화되어 있습니다. |
WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK | WebView2Loader.dll 의 명시적 링크를 활성화( 1 )하거나 비활성화( 0 )합니다. 이를 활성화하면 가져오기 라이브러리( *.lib )가 필요하지 않습니다. WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL 이 활성화된 경우 이 옵션은 기본적으로 활성화됩니다. |
Windows에서 MinGW-w64를 사용하여 이 라이브러리를 빌드하려면 C++14를 지원하고 최신 Windows SDK가 있어야 합니다.
호환 가능한 것으로 알려진 배포판:
Microsoft WebView2 SDK의 WebView2 로더 부분을 연결하는 것은 webview 라이브러리를 사용할 때 어려운 요구 사항이 아니며 WebView2Loader.dll
앱과 함께 배포하지도 않습니다.
그러나 런타임에 WebView2Loader.dll
로드할 수 있는 경우(예: 실행 파일 디렉터리에서) 해당 WebView2Loader.dll이 사용됩니다. 그렇지 않으면 최소한의 구현이 대신 사용됩니다.
공식 로더를 사용하려면 정적으로 링크하지 않는 한 앱과 함께 배포해야 합니다. Visual C++에서는 정적으로 링크하는 것이 가능하지만 MinGW-w64에서는 가능하지 않습니다.
다음은 로더 구현이 공식 구현과 다른 몇 가지 주목할만한 점입니다.
WEBVIEW2_BROWSER_EXECUTABLE_FOLDER
와 같은 환경 변수를 사용한 WebView2 구성을 지원하지 않습니다.사용자 정의 옵션을 사용하여 라이브러리가 WebView2 로더를 통합하는 방법을 변경할 수 있습니다.
이 프로젝트는 CMake 빌드 시스템을 사용합니다.
웹뷰 라이브러리 개발을 위해 본 문서 앞부분에서 언급한 종속성 외에도 웹뷰 라이브러리 개발 중에는 다음이 사용됩니다.
clang-format
clang-tidy
cmake -G " Ninja Multi-Config " -B build -S .
cmake --build build --config CONFIG
CONFIG
Debug
, Release
또는 Profile
중 하나로 바꿉니다. Profile
사용하여 코드 적용 범위(GCC/Clang)를 활성화합니다.
테스트 실행:
ctest --test-dir build --build-config CONFIG
테스트 범위 보고서 생성:
gcovr
build/coverage
에서 적용 범위 보고서를 찾으세요.
프로젝트의 Debug
및 Release
구성을 빌드한 후 이를 실행합니다.
cd build
cpack -G External -C " Debug;Release " --config CPackConfig.cmake
cmake/toolchains
디렉터리의 CMake 도구 체인 파일을 참조하세요.
예를 들어, 이는 POSIX 스레드가 있는 Linux의 Windows x64를 대상으로 합니다.
cmake -G " Ninja Multi-Config " -B build -S . -D CMAKE_TOOLCHAIN_FILE=cmake/toolchains/x86_64-w64-mingw32.cmake -D WEBVIEW_TOOLCHAIN_EXECUTABLE_SUFFIX=-posix
cmake --build build --config CONFIG
브라우저 엔진은 완전한 웹 브라우저가 아니기 때문에 브라우저에서 기대할 수 있는 모든 기능을 지원하지 않을 수 있습니다. 기능이 예상대로 작동하지 않는 경우 브라우저 엔진 설명서를 참조하고 라이브러리가 해당 기능을 지원해야 한다고 생각되면 문제를 열어주세요.
예를 들어, 라이브러리는 alert()
, confirm()
및 prompt()
와 같은 사용자 상호 작용 기능과 console.log()
와 같은 기타 비필수 기능을 지원하려고 시도하지 않습니다.
언어 | 프로젝트 |
---|---|
에이다 | thechampagne/webview-ada |
혈액 요소 질소 | tr1ckydev/webview-bun |
기음# | 웹뷰/webview_csharp |
C3 | thechampagne/webview-c3 |
결정 | 나크비스/웹뷰 |
디 | thechampagne/webview-d, ronnie-w/webviewd |
데노 | 웹뷰/webview_deno |
가다 | 웹뷰/webview_go |
항구 | EricLendvai/Harbour_WebView |
하스켈 | lettier/webviewhs |
자넷 | janet-lang/webview |
자바 | 웹뷰/webview_java |
코틀린 | Winterreisender/webviewko |
님 | oskca/webview, neroist/webview |
Node.js | Winterreisender/webview-nodejs |
오딘 | thechampagne/webview-odin |
파스칼 | PierceNg/fpwebview |
파이썬 | congzhangzh/webview_python,zserge/webview-python |
PHP | 0시간/php-웹뷰 |
루비 | Maaarcocr/webview_ruby |
녹 | Boscop/웹뷰 |
스위프트 | jakenvac/SwiftWebview |
다섯 | 말리시피/mui, ttytm/webview |
급격한 변경 | thechampagne/webview-zig |
목록에 바인딩을 추가하려면 언제든지 끌어오기 요청을 제출하거나 이슈를 개설하세요.
포함된 SWIG 인터페이스( webview.i
)를 사용하여 라이브러리에 대한 바인딩을 직접 생성할 수 있습니다.
다음은 시작하는 데 도움이 되는 몇 가지 예입니다. 간결성을 위해 Unix 스타일 명령줄이 사용됩니다.
mkdir -p build/bindings/{python,csharp,java,ruby}
swig -c++ -python -outdir build/bindings/python -o build/bindings/python/python_wrap.cpp webview.i
swig -c++ -csharp -outdir build/bindings/csharp -o build/bindings/csharp/csharp_wrap.cpp webview.i
swig -c++ -java -outdir build/bindings/java -o build/bindings/java/java_wrap.cpp webview.i
swig -c++ -ruby -outdir build/bindings/ruby -o build/bindings/ruby/ruby_wrap.cpp webview.i
코드는 MIT 라이센스에 따라 배포되므로 독점 프로젝트에서도 자유롭게 사용할 수 있습니다.