一个用于 C/C 的小型跨平台 Webview 库,用于构建现代跨平台 GUI。
该项目的目标是为最广泛使用的平台创建一个通用的 HTML5 UI 抽象层。
它支持双向 JavaScript 绑定(从 C/C 调用 JavaScript 和从 JavaScript 调用 C/C )。
笔记
Go 的语言绑定已发生变化。此存储库中提供 <= 0.1.1 的版本。
平台 | 技术 |
---|---|
Linux | GTK 3 , WebKitGTK |
苹果系统 | 可可、WebKit |
视窗 | Windows API , WebView2 |
最新的文档就在源代码中。改进文档是一项持续的工作,我们非常欢迎您做出贡献。
除了需要更现代版本的平台之外,您的编译器必须至少支持 C 11。
开发和分发需要GTK和WebKit2GTK库。您需要检查您的软件包存储库以了解如何安装这些软件包。
基于 Debian 的系统:
- 套餐:
- 发展:
apt install libgtk-3-dev libwebkit2gtk-4.0-dev
- 生产:
apt install libgtk-3-0 libwebkit2gtk-4.0-37
- 发展:
基于 Fedora 的系统:
- 套餐:
- 发展:
dnf install gtk3-devel webkit2gtk4.0-devel
- 生产:
dnf install gtk3 webkit2gtk4.0
- 发展:
基于 BSD 的系统:
- FreeBSD 软件包:
pkg install webkit2-gtk3
- 在基于 BSD 的系统上执行可能需要将
wxallowed
选项(请参阅mount(8))添加到 fstab 中,以绕过可执行文件的W^X内存保护。请先看看在不禁用此安全功能的情况下它是否有效。
您的编译器必须支持 C 14,我们建议将其与最新的 Windows 10 SDK 配对。
对于 Visual C ,我们建议使用 Visual Studio 2022 或更高版本。我们为 MinGW-w64 有一个单独的部分。
对于 Windows 11 之前的任何 Windows 版本,开发人员和最终用户必须在其系统上安装WebView2 运行时。
如果您是该项目的开发人员,请转到开发部分。
这里的说明是在使用 Unix 风格的命令行编译 C/C 代码时为 GCC 编写的,并假设多个命令在同一个 shell 会话中执行。Windows 的命令行使用特定于 Command shell 的语法,但只要相应地调整命令,您就可以使用任何 shell,例如 PowerShell。在 Windows 上构建时请参阅MinGW-w64 要求。
您将拥有一个可以运行的应用程序,但我们鼓励您探索可用的示例并尝试超越单纯基础知识的示例。
首先为您的项目创建一个新的目录结构:
mkdir my-project && cd my-project mkdir build libs "libs/webview"
编译程序时需要WebView2 SDK :
mkdir libs\webview2 curl -sSL "https://www.nuget.org/api/v2/package/Microsoft.Web.WebView2" | tar -xf - -C libs\webview2
如果您想使用官方 WebView2 加载器 ( WebView2Loader.dll
),请获取 DLL 的副本(替换x64
为您的目标架构):
copy /Y libs\webview2\build\native\x64\WebView2Loader.dll build
注意:有关更多选项,请参阅WebView2 加载程序部分。
获取webview库:
curl -sSLo "libs/webview/webview.h" "https://raw.githubusercontent.com/webview/webview/master/webview.h" curl -sSLo "libs/webview/webview.cc" "https://raw.githubusercontent.com/webview/webview/master/webview.cc"
将基本 C 示例保存到您的项目目录中:
curl -sSLo basic.cc "https://raw.githubusercontent.com/webview/webview/master/examples/basic.cc"
构建并运行示例:
# Linux g basic.cc -std=c 11 -Ilibs/webview $(pkg-config --cflags --libs gtk -3.0 webkit2gtk-4.0) -o build/basic && ./build/basic # macOS g basic.cc -std=c 11 -Ilibs/webview -framework WebKit -o build/basic && ./build/basic # Windows/MinGW g basic.cc -std=c 14 -mwindows -Ilibs/webview -Ilibs/webview2/build/native/include -ladvapi32 -lole32 -lshell32 -lshlwapi -luser32 -lversion -o build/basic.exe && "build/basic.exe"
构建一个 C 示例:
cl basic.cc /std:c 14 /EHsc /Fobuild\ ^ /I libs\webview ^ /I libs\webview2\build\native\include ^ /link /OUT:build\basic.exe
将基本 C 示例保存到您的项目目录中:
curl -sSLo basic.c "https://raw.githubusercontent.com/webview/webview/master/examples/basic.c"
构建库和示例,然后运行它:
# Linux g -c libs/webview/webview.cc -std=c 11 -DWEBVIEW_STATIC $(pkg-config --cflags gtk -3.0 webkit2gtk-4.0) -o build/webview.o gcc -c basic.c -std=c99 -Ilibs/webview -o build/basic.o g build/basic.o build/webview.o $(pkg-config --libs gtk -3.0 webkit2gtk-4.0) -o build/basic && build/basic # macOS g -c libs/webview/webview.cc -std=c 11 -DWEBVIEW_STATIC -o build/webview.o gcc -c basic.c -std=c99 -Ilibs/webview -o build/basic.o g build/basic.o build/webview.o -framework WebKit -o build/basic && build/basic # Windows/MinGW g -c libs/webview/webview.cc -std=c 14 -DWEBVIEW_STATIC -Ilibs/webview2/build/native/include -o build/webview.o gcc -c basic.c -std=c99 -Ilibs/webview -o build/basic.o g build/basic.o build/webview.o -mwindows -ladvapi32 -lole32 -lshell32 -lshlwapi -luser32 -lversion -o build/basic.exe && "build/basic.exe"
构建共享库:
cl libs\webview\webview.cc /std:c 14 /EHsc /Fobuild\ ^ /D WEBVIEW_BUILD_SHARED ^ /I libs\webview ^ /I libs\webview2\build\native\include ^ /link /DLL /OUT:build\webview.dll
使用共享库构建一个 C 示例:
cl basic.c build\webview.lib /EHsc /Fobuild\ ^ /D WEBVIEW_SHARED ^ /I libs\webview ^ /link /OUT:build\basic.exe
此处显示的示例只是更大图片的一部分,因此我们鼓励您尝试其他示例并自行探索 - 您可以遵循相同的过程。如果您发现任何问题,请与我们联系。
姓名 | 描述 |
---|---|
WEBVIEW_API |
控制 C API 链接、符号可见性以及是否是共享库。默认情况下,这inline 适用于 C 和extern C。 |
WEBVIEW_BUILD_SHARED |
修改WEBVIEW_API 以构建共享库。 |
WEBVIEW_SHARED |
修改WEBVIEW_API 为使用共享库。 |
WEBVIEW_STATIC |
修改WEBVIEW_API 以构建或使用静态库。 |
您的应用程序的分发超出了该库的范围,但我们可以为您提供一些探索的指导。
在 macOS 上,您通常会为您的应用程序创建一个包含图标和适当元数据的捆绑包。
简约的捆绑包通常具有以下目录结构:
example.app bundle
└── Contents
├── Info.plist information property list
├── MacOS
| └── example executable
└── Resources
└── example.icns icon
在 Apple 开发者网站上了解有关捆绑包结构的更多信息。
提示:该
png2icns
工具可以从 PNG 文件创建 icns 文件。请参阅icnsutils
基于 Debian 的系统的软件包。
您通常会创建一个资源脚本文件 ( *.rc
),其中包含有关应用程序的信息以及图标。由于您应该随时可用 MinGW-w64,因此您可以使用编译该文件windres
并将其链接到您的程序中。如果您使用 Visual C ,那么请查看Windows 资源编译器。
目录结构可能如下所示:
my-project/
├── icons/
| ├── application.ico
| └── window.ico
├── basic.cc
└── resources.rc
resources.rc
:
100 ICON "icons\\application.ico"
32512 ICON "icons\\window.ico"
注意:窗口使用的图标资源ID必须为
32512
(IDI_APPLICATION
)。
编译:
windres -o build/resources.o resources.rc g basic.cc build/resources.o [...]
请记住捆绑未静态链接的 DLL,例如来自 MinGW-w64 的 DLL 以及可选的WebView2Loader.dll
.
为了在 Windows 上使用 MinGW-w64 构建此库,它必须支持 C 14 并具有最新的 Windows SDK。
已知兼容的发行版:
使用我们的 webview 库时,链接 Microsoft WebView2 SDK 的 WebView2 加载器部分并不是硬性要求,也不是WebView2Loader.dll
与您的应用程序一起分发。
然而,如果WebView2Loader.dll
可以在运行时加载,例如从可执行文件的目录,那么它将被使用;否则将使用我们的简约实现。
如果您希望使用官方加载程序,请记住将其与您的应用程序一起分发,除非您静态链接它。Visual C 可以静态链接它,但 MinGW-w64 不行。
以下是我们的加载器实现与官方实现的一些值得注意的不同之处:
- 不支持使用环境变量(例如
WEBVIEW2_BROWSER_EXECUTABLE_FOLDER
. - 不支持 Microsoft Edge Insider(预览)频道。
以下编译时选项可用于更改库集成 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
启用。
要构建库、示例并运行测试,请使用script
目录中的构建脚本之一:
-
build.sh
:- 在基于 Unix 的系统上。
- 在 Windows 上的类 Unix 环境(例如 MSYS2)上。
-
build.bat
:- 在 Windows 上使用 Visual C 构建时。
您可以在命令行上为这些脚本指定单独的任务:
任务 | 描述 |
---|---|
info |
显示信息。 |
clean |
清理构建目录。 |
format |
重新格式化代码。 |
deps |
获取依赖项。 |
check |
运行检查。 |
build |
构建库、示例和测试。 |
test |
运行测试。 |
此外,脚本接受以下环境变量。
两个脚本:
多变的 | 描述 |
---|---|
CI |
更改 CI 环境中的行为(更严格)。 |
TARGET_ARCH |
交叉编译的目标架构 ( x64 , x86 )。 |
BUILD_DIR |
覆盖构建目录的路径。 |
仅有的build.sh
:
多变的 | 描述 |
---|---|
HOST_OS |
主机操作系统 ( linux , macos , windows )。 |
TARGET_OS |
用于交叉编译的目标操作系统(请参阅 参考资料HOST_OS )。 |
CC |
C编译器可执行。 |
CXX |
C 编译器可执行文件。 |
LIB_PREFIX |
库名称前缀。 |
PKGCONFIG |
替代pkgconfig 可执行文件。 |
请参阅 CI 配置示例。
由于浏览器引擎不是一个完整的网络浏览器,它可能不支持您期望浏览器提供的所有功能。如果您发现某个功能未按预期工作,请查阅浏览器引擎的文档,并在您认为该库应该支持该功能时提出问题。
例如,该库不会尝试支持用户交互功能,例如alert()
、confirm()
和prompt()
以及其他非必要功能,例如console.log()
.
语言 | 项目 |
---|---|
包子 | tr1ckydev/webview-bun |
C# | 网页视图/webview_csharp |
C3 | 香槟/webview-c3 |
水晶 | 纳克维斯/网页视图 |
D | 香槟/webview-d |
德诺 | 网页视图/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 | zserge/webview-python |
PHP | 0小时/php-webview |
红宝石 | Maaarcocr/webview_ruby |
锈 | Boscop/网络视图 |
迅速 | jakenvac/SwiftWebview |
V | malisipi/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 许可下分发的,也可以在您的专有项目中随意使用它。