一个用于 C/C++ 的小型跨平台 Webview 库,用于构建现代跨平台 GUI。
该项目的目标是为最广泛使用的平台创建一个通用的 HTML5 UI 抽象层。
它支持双向 JavaScript 绑定(从 C/C++ 调用 JavaScript 和从 JavaScript 调用 C/C++)。
笔记
Go 的语言绑定已发生变化。此存储库中提供 <= 0.1.1 的版本。
平台 | 技术 |
---|---|
Linux | GTK、WebKitGTK |
macOS | 可可、WebKit |
视窗 | Windows API、WebView2 |
最新的文档就在源代码中。改进文档是一项持续的工作,我们非常欢迎您做出贡献。
除了需要更现代版本的平台之外,您的编译器必须至少支持 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
pkg-config
与--cflags
和--libs
一起使用来获取这些模块集之一的编译器/链接器选项: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))添加到 fstab 中,以绕过可执行文件的 W^X 内存保护。请先看看在不禁用此安全功能的情况下它是否有效。您的编译器必须支持 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-format |
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-format 检查 |
WEBVIEW_STRICT_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 | 启用 ( 1 ) 或禁用 ( 0 ) WebView2 加载程序的内置实现。启用此功能可以避免对WebView2Loader.dll 的需要,但如果 DLL 存在,则 DLL 优先。默认情况下启用此选项。 |
WEBVIEW_MSWEBVIEW2_EXPLICIT_LINK | 启用 ( 1 ) 或禁用 ( 0 ) WebView2Loader.dll 的显式链接。启用此功能可以避免导入库 ( *.lib ) 的需要。如果启用了WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL ,则默认启用此选项。 |
为了在 Windows 上使用 MinGW-w64 构建此库,它必须支持 C++14 并具有最新的 Windows SDK。
已知兼容的发行版:
使用我们的 webview 库时,链接 Microsoft WebView2 SDK 的 WebView2 加载程序部分并不是硬性要求,并且与您的应用程序一起分发WebView2Loader.dll
也不是硬性要求。
但是,如果WebView2Loader.dll
在运行时可加载(例如从可执行文件的目录中),则将使用它;否则将使用我们的简约实现。
如果您希望使用官方加载程序,请记住将其与您的应用程序一起分发,除非您静态链接它。 Visual C++ 可以静态链接它,但 MinGW-w64 不行。
以下是我们的加载器实现与官方实现的一些值得注意的不同之处:
WEBVIEW2_BROWSER_EXECUTABLE_FOLDER
配置 WebView2。自定义选项可用于更改库集成 WebView2 加载器的方式。
该项目使用 CMake 构建系统。
除了本文档前面提到的使用webview 库进行开发的依赖项之外,在 webview 库的开发过程中还会用到以下依赖项。
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()
。
语言 | 项目 |
---|---|
艾达 | 香槟/webview-ada |
包子 | tr1ckydev/webview-bun |
C# | 网页视图/webview_csharp |
C3 | 香槟/webview-c3 |
水晶 | 纳克维斯/网页视图 |
D | thechampagne/webview-d, ronnie-w/webviewd |
德诺 | 网页视图/webview_deno |
去 | 网页视图/webview_go |
港口 | EricLendvai/Harbour_WebView |
哈斯克尔 | 莱蒂尔/webviewhs |
珍妮特 | 珍妮特·朗/webview |
爪哇 | webview/webview_java |
科特林 | Winterreisender/webviewko |
尼姆 | oskca/webview、neroist/webview |
Node.js | Winterreisender/webview-nodejs |
奥丁 | thechampagne/webview-odin |
帕斯卡 | PierceNg/fpwebview |
Python | congzhangzh/webview_python,zserge/webview-python |
PHP | 0小时/php-webview |
红宝石 | Maaarcocr/webview_ruby |
锈 | Boscop/网络视图 |
迅速 | jakenvac/SwiftWebview |
V | 马里西皮/mui、ttytm/webview |
之字形 | 香槟/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 许可下分发的,也可以在您的专有项目中随意使用它。