Eine kleine plattformübergreifende Webview-Bibliothek für C/C++ zum Erstellen moderner plattformübergreifender GUIs.
Ziel des Projekts ist die Schaffung einer gemeinsamen HTML5-UI-Abstraktionsschicht für die am weitesten verbreiteten Plattformen.
Es unterstützt bidirektionale JavaScript-Bindungen (zum Aufrufen von JavaScript aus C/C++ und zum Aufrufen von C/C++ aus JavaScript).
Notiz
Die Sprachbindung für Go wurde verschoben. Versionen <= 0.1.1 sind in diesem Repository verfügbar.
Plattform | Technologien |
---|---|
Linux | GTK, WebKitGTK |
macOS | Kakao, WebKit |
Windows | Windows-API, WebView2 |
Die aktuellste Dokumentation befindet sich direkt im Quellcode. Die Verbesserung der Dokumentation ist eine kontinuierliche Anstrengung und Sie sind herzlich willkommen, dazu beizutragen.
Ihr Compiler muss mindestens C++11 unterstützen, mit Ausnahme von Plattformen, die eine modernere Version erfordern.
Dieses Projekt verwendet CMake und Ninja. Diese Tools werden zwar aus praktischen Gründen empfohlen, sind für die Verwendung der Bibliothek jedoch nicht erforderlich.
Für die Entwicklung und Verteilung sind die Bibliotheken GTK und WebKitGTK erforderlich. Sie müssen in Ihren Paket-Repositorys überprüfen, welche Pakete installiert werden sollen.
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
pkg-config
mit --cflags
und --libs
um die Compiler-/Linker-Optionen für einen dieser Modulsätze abzurufen: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
(siehe mount(8)) zu Ihrer fstab, um den W^X-Speicherschutz für Ihre ausführbare Datei zu umgehen. Bitte prüfen Sie zunächst, ob es funktioniert, ohne diese Sicherheitsfunktion zu deaktivieren.Ihr Compiler muss C++14 unterstützen und wir empfehlen, ihn mit einem aktuellen Windows 10 SDK zu koppeln.
Für Visual C++ empfehlen wir Visual Studio 2022 oder höher. Bei der Verwendung von MinGW-w64 gelten einige Anforderungen.
Entwickler und Endbenutzer müssen die WebView2-Laufzeitumgebung für jede Windows-Version vor Windows 11 auf ihrem System installiert haben.
Wenn Sie Entwickler dieses Projekts sind, gehen Sie bitte zum Abschnitt „Entwicklung“.
Sie verfügen über eine funktionierende App, wir empfehlen Ihnen jedoch, die verfügbaren Beispiele zu erkunden.
Erstellen Sie die folgenden Dateien in einem neuen Verzeichnis:
.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 ;
}
Erstellen Sie das Projekt:
cmake -G Ninja -B build -S . -D CMAKE_BUILD_TYPE=Release
cmake --build build
Suchen Sie die ausführbare Datei im Verzeichnis build/bin
.
Eine zusammengeführte Bibliothek kann beim Erstellen des Projekts mit CMake erstellt werden, oder das Skript amalgamate.py
kann direkt aufgerufen werden.
Letzteres wird im Folgenden beschrieben.
python3 scripts/amalgamate.py --output webview_amalgamation.h core/include/webview/webview.h
Informationen zur Skriptverwendung finden Sie unter python3 scripts/amalgamate.py --help
.
Hier ist ein Beispiel für den direkten Aufruf von GCC/Clang-ähnlichen Compilern. Verwenden Sie die Datei main.cc
aus dem vorherigen Beispiel.
Platzieren Sie entweder den zusammengeführten webview.h
Header oder alle einzelnen Dateien in libs/webview
und WebView2.h
von MS WebView2 in libs
.
Erstellen Sie das Projekt auf der von Ihnen gewählten Plattform.
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
Die folgenden CMake-Ziele sind verfügbar:
Name | Beschreibung |
---|---|
webview::core | Header für C++. |
webview::core_shared | Gemeinsame Bibliothek für C. |
webview::core_static | Statische Bibliothek für C. |
Besondere Ziele für Bedarfskontrollen und damit verbundene Aufgaben:
Name | Beschreibung |
---|---|
webview_format_check | Überprüfen Sie Dateien im Clang-Format. |
webview_reformat | Formatieren Sie Dateien mit dem Clang-Format neu. |
Die folgenden booleschen Optionen können beim eigenständigen Erstellen des Webview-Projekts oder beim Erstellen als Teil Ihres Projekts (z. B. mit FetchContent) verwendet werden.
Option | Beschreibung |
---|---|
WEBVIEW_BUILD | Bauen ermöglichen |
WEBVIEW_BUILD_AMALGAMATION | Bauen Sie eine zusammengeführte Bibliothek auf |
WEBVIEW_BUILD_DOCS | Erstellen Sie eine Dokumentation |
WEBVIEW_BUILD_EXAMPLES | Baubeispiele |
WEBVIEW_BUILD_SHARED_LIBRARY | Erstellen Sie gemeinsam genutzte Bibliotheken |
WEBVIEW_BUILD_STATIC_LIBRARY | Erstellen Sie statische Bibliotheken |
WEBVIEW_BUILD_TESTS | Erstellen Sie Tests |
WEBVIEW_ENABLE_CHECKS | Aktivieren Sie Prüfungen |
WEBVIEW_ENABLE_CLANG_FORMAT | Clang-Format aktivieren |
WEBVIEW_ENABLE_CLANG_TIDY | Aktivieren Sie Clang-Tidy |
WEBVIEW_ENABLE_PACKAGING | Paketierung aktivieren |
WEBVIEW_INSTALL_DOCS | Dokumentation installieren |
WEBVIEW_INSTALL_TARGETS | Ziele installieren |
WEBVIEW_IS_CI | Initialisiert durch die CI Umgebungsvariable |
WEBVIEW_PACKAGE_AMALGAMATION | Paketzusammengeführte Bibliothek |
WEBVIEW_PACKAGE_DOCS | Paketdokumentation |
WEBVIEW_PACKAGE_HEADERS | Paket-Header |
WEBVIEW_PACKAGE_LIB | Kompilierte Bibliotheken verpacken |
WEBVIEW_STRICT_CHECKS | Führen Sie strenge Kontrollen durch |
WEBVIEW_STRICT_CLANG_FORMAT | Machen Sie die Prüfung des Clang-Formats streng |
WEBVIEW_STRICT_CLANG_TIDY | Führen Sie eine strenge Sauberkeitsprüfung durch |
WEBVIEW_USE_COMPAT_MINGW | Verwenden Sie den Kompatibilitätshelfer für MinGW |
WEBVIEW_USE_STATIC_MSVC_RUNTIME | Verwenden Sie eine statische Laufzeitbibliothek (MSVC) |
Notiz
Prüfungen sind standardmäßig aktiviert , werden jedoch für die lokale Entwicklung nicht standardmäßig erzwungen (gesteuert durch die Option WEBVIEW_IS_CI
).
Nicht-boolesche Optionen:
Option | Beschreibung |
---|---|
WEBVIEW_CLANG_FORMAT_EXE | Pfad der ausführbaren Datei clang-format . |
WEBVIEW_CLANG_TIDY_EXE | Pfad der ausführbaren clang-tidy Datei. |
Diese Optionen können bei Verwendung des Webview-CMake-Pakets verwendet werden.
Option | Beschreibung |
---|---|
WEBVIEW_WEBKITGTK_API | WebKitGTK-API zur Schnittstelle mit z. B. 6.0 , 4.1 (empfohlen) oder 4.0 . Dadurch wird auch automatisch die GTK-Version ermittelt. Verwendet standardmäßig die neueste empfohlene API, sofern verfügbar, oder die neueste bekannte und verfügbare API. Beachten Sie, dass es große Unterschiede zwischen den API-Versionen geben kann, die sich auf die Funktionsverfügbarkeit auswirken können. Weitere Informationen zur Funktionsverfügbarkeit finden Sie in der Webview-API-Dokumentation. |
Option | Beschreibung |
---|---|
WEBVIEW_MSWEBVIEW2_VERSION | MS WebView2-Version, z. B. 1.0.1150.38 . |
WEBVIEW_USE_BUILTIN_MSWEBVIEW2 | Verwenden Sie das integrierte MS WebView2. |
Diese Optionen können als Präprozessormakros angegeben werden, um den Build zu ändern, sind jedoch bei Verwendung von CMake nicht erforderlich.
Name | Beschreibung |
---|---|
WEBVIEW_API | Steuert die C-API-Verknüpfung, die Symbolsichtbarkeit und ob es sich um eine gemeinsam genutzte Bibliothek handelt. Standardmäßig ist dies inline für C++ und extern für C. |
WEBVIEW_BUILD_SHARED | Ändert WEBVIEW_API zum Erstellen einer gemeinsam genutzten Bibliothek. |
WEBVIEW_SHARED | Ändert WEBVIEW_API für die Verwendung einer gemeinsam genutzten Bibliothek. |
WEBVIEW_STATIC | Ändert WEBVIEW_API zum Erstellen oder Verwenden einer statischen Bibliothek. |
Name | Beschreibung |
---|---|
WEBVIEW_GTK | Kompilieren Sie das GTK/WebKitGTK-Backend. |
WEBVIEW_COCOA | Kompilieren Sie das Cocoa/WebKit-Backend. |
WEBVIEW_EDGE | Kompilieren Sie das Win32/WebView2-Backend. |
Option | Beschreibung |
---|---|
WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL | Aktiviert ( 1 ) oder deaktiviert ( 0 ) die integrierte Implementierung des WebView2-Loaders. Wenn Sie dies aktivieren, ist WebView2Loader.dll nicht erforderlich. Wenn die DLL jedoch vorhanden ist, hat die DLL Vorrang. Diese Option ist standardmäßig aktiviert. |
WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK | Aktiviert ( 1 ) oder deaktiviert ( 0 ) die explizite Verknüpfung von WebView2Loader.dll . Wenn Sie dies aktivieren, sind keine Importbibliotheken ( *.lib ) erforderlich. Diese Option ist standardmäßig aktiviert, wenn WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL aktiviert ist. |
Um diese Bibliothek mit MinGW-w64 unter Windows zu erstellen, muss sie C++14 unterstützen und über ein aktuelles Windows SDK verfügen.
Bekanntermaßen kompatible Distributionen:
Das Verknüpfen des WebView2-Loader-Teils des Microsoft WebView2 SDK ist keine zwingende Voraussetzung, wenn Sie unsere Webview-Bibliothek verwenden, und die Verteilung von WebView2Loader.dll
mit Ihrer App ist auch nicht erforderlich.
Wenn WebView2Loader.dll
jedoch zur Laufzeit ladbar ist, z. B. aus dem Verzeichnis der ausführbaren Datei, wird sie verwendet. andernfalls wird stattdessen unsere minimalistische Implementierung verwendet.
Wenn Sie den offiziellen Loader verwenden möchten, denken Sie daran, ihn zusammen mit Ihrer App zu verteilen, es sei denn, Sie verknüpfen ihn statisch. Eine statische Verknüpfung ist mit Visual C++ möglich, jedoch nicht mit MinGW-w64.
Hier sind einige der bemerkenswerten Unterschiede zwischen unserer Implementierung des Loaders und der offiziellen Implementierung:
WEBVIEW2_BROWSER_EXECUTABLE_FOLDER
.Anpassungsoptionen können verwendet werden, um zu ändern, wie die Bibliothek den WebView2-Loader integriert.
Dieses Projekt verwendet das CMake-Build-System.
Zusätzlich zu den zuvor in diesem Dokument erwähnten Abhängigkeiten für die Entwicklung mit der Webview-Bibliothek werden die folgenden während der Entwicklung der Webview-Bibliothek verwendet.
clang-format
clang-tidy
cmake -G " Ninja Multi-Config " -B build -S .
cmake --build build --config CONFIG
Ersetzen Sie CONFIG
durch eines von Debug
, Release
oder Profile
. Verwenden Sie Profile
, um die Codeabdeckung (GCC/Clang) zu aktivieren.
Führen Sie Tests durch:
ctest --test-dir build --build-config CONFIG
Testabdeckungsbericht erstellen:
gcovr
Den Abdeckungsbericht finden Sie unter build/coverage
.
Führen Sie dies aus, nachdem Sie die Debug
und Release
-Konfigurationen des Projekts erstellt haben:
cd build
cpack -G External -C " Debug;Release " --config CPackConfig.cmake
Siehe CMake-Toolchain-Dateien im Verzeichnis cmake/toolchains
.
Dies zielt beispielsweise auf Windows x64 unter Linux mit POSIX-Threads ab:
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
Da es sich bei einer Browser-Engine nicht um einen vollständigen Webbrowser handelt, unterstützt sie möglicherweise nicht alle Funktionen, die Sie von einem Browser erwarten. Wenn Sie feststellen, dass eine Funktion nicht wie erwartet funktioniert, lesen Sie bitte die Dokumentation der Browser-Engine und öffnen Sie ein Problem, wenn Sie der Meinung sind, dass die Bibliothek sie unterstützen sollte.
Beispielsweise versucht die Bibliothek nicht, Benutzerinteraktionsfunktionen wie alert()
, confirm()
und prompt()
sowie andere nicht wesentliche Funktionen wie console.log()
zu unterstützen.
Sprache | Projekt |
---|---|
Ada | thechampagne/webview-ada |
Brötchen | tr1ckydev/webview-bun |
C# | webview/webview_csharp |
C3 | thechampagne/webview-c3 |
Kristall | naqvis/webview |
D | thechampagne/webview-d, ronnie-w/webviewd |
Deno | webview/webview_deno |
Gehen | webview/webview_go |
Hafen | EricLendvai/Harbour_WebView |
Haskell | lettier/webviewhs |
Janet | janet-lang/webview |
Java | webview/webview_java |
Kotlin | Winterreisender/webviewko |
Nim | oskca/webview, neroist/webview |
Node.js | Winterreisender/webview-nodejs |
Odin | thechampagne/webview-odin |
Pascal | PierceNg/fpwebview |
Python | congzhangzh/webview_python,zserge/webview-python |
PHP | 0hr/php-webview |
Rubin | Maaarcocr/webview_ruby |
Rost | Boscop/Web-Ansicht |
Schnell | jakenvac/SwiftWebview |
V | malisipi/mui, ttytm/webview |
Zig | thechampagne/webview-zig |
Wenn Sie der Liste Bindungen hinzufügen möchten, können Sie gerne eine Pull-Anfrage einreichen oder ein Problem eröffnen.
Mithilfe der enthaltenen SWIG-Schnittstelle ( webview.i
) können Sie selbst Bindungen für die Bibliothek generieren.
Hier sind einige Beispiele, um Ihnen den Einstieg zu erleichtern. Der Übersichtlichkeit halber werden Befehlszeilen im Unix-Stil verwendet.
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
Der Code wird unter MIT-Lizenz verteilt. Sie können ihn gerne auch in Ihren proprietären Projekten verwenden.