WebktiGtk 未加载 .so 扩展
WebktiGtk not loading .so extensions
出于某种原因,我似乎无法让 WebkitGTK (2.22.4) 加载 .so 网络扩展,我不太确定为什么会这样。我有以下设置(有点精简)WebkitGtk 本身在加载页面时工作正常,它会触发 initialize-web-extensions 信号,因此正在设置目录。
然而,即使扩展的 .so 文件位于工作目录(可执行文件也位于该目录)中,它似乎从未被加载。也许我遗漏了什么。
除了几个非常简略的示例之外,我也找不到那么多关于此具体实现的文档。 (我看过了,但没有进一步了解,因为示例代码完全相同)。
希望这里的任何人都有想法。
main.cpp
#include <gtk/gtk.h>
#include <webkit2/webkit2.h>
WebKitWebContext* context;
void initialize_web_extensions(WebKitWebContext* context, gpointer user_data) {
g_print("[webkit2 web-extensions] initialize-web-extensions\n");
webkit_web_context_set_web_extensions_directory(context, ".");
return;
}
int main(int argc, char * argv[])
{
exec_dir = dirname(realpath(argv[0], NULL));
gtk_init(&argc, &argv);
context = webkit_web_context_get_default();
g_signal_connect(context, "initialize-web-extensions", G_CALLBACK(initialize_web_extensions), NULL);
GtkWidget* window_widget;
GtkWindow* window;
window_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
window = GTK_WINDOW(window_widget);
WebKitWebView* webview = WEBKIT_WEB_VIEW(webkit_web_view_new());
GtkWidget* webview_widget = GTK_WIDGET(webview);
webkit_web_view_load_uri(webview, "https://google.com");
gtk_container_add(GTK_CONTAINER(window_widget), webview_widget);
gtk_widget_show_all(window_widget);
gtk_main();
return 0;
}
web_extension.cpp
static void
web_page_created_callback (WebKitWebExtension *extension,
WebKitWebPage *web_page,
gpointer user_data)
{
g_print ("Page %d created for %s\n",
webkit_web_page_get_id (web_page),
webkit_web_page_get_uri (web_page));
}
G_MODULE_EXPORT void
webkit_web_extension_initialize (WebKitWebExtension *extension)
{
g_signal_connect (extension, "page-created",
G_CALLBACK (web_page_created_callback),
NULL);
}
CMakeLists.txt
set(APP_SRCS main.cpp)
set(EXT_SRCS web_extension.cpp)
# Target executable names.
set(TARGET "app")
set(EXT_TARGET "extension")
# find gtk
PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0)
include_directories(${GTK3_INCLUDE_DIRS})
link_directories(${GTK3_LIBRARY_DIRS})
add_definitions(${GTK3_CFLAGS_OTHER})
# include webkitgtk
PKG_CHECK_MODULES(WEBKIT REQUIRED webkit2gtk-4.0 webkit2gtk-web-extension-4.0)
include_directories(${WEBKIT_INCLUDE_DIRS})
link_directories(${WEBKIT_LIBRARY_DIRS})
add_definitions(${WEBKIT_CFLAGS_OTHER})
# add extension
add_library(${EXT_TARGET} SHARED ${EXT_SRCS})
target_link_libraries(${EXT_TARGET} ${WEBKIT_LIBRARIES})
# Executable target.
add_executable(${TARGET} ${APP_SRCS})
SET_EXECUTABLE_TARGET_PROPERTIES(${TARGET})
target_link_libraries(${TARGET} ${EXT_TARGET})
target_link_libraries(${TARGET} ${GTK3_LIBRARIES})
target_link_libraries(${TARGET} ${WEBKIT_LIBRARIES})
显然它与 C++ 编译器中的符号重整有关。必须添加
external "C" {
...
}
明确禁用重整,以便主应用程序可以找到 public 符号。
出于某种原因,我似乎无法让 WebkitGTK (2.22.4) 加载 .so 网络扩展,我不太确定为什么会这样。我有以下设置(有点精简)WebkitGtk 本身在加载页面时工作正常,它会触发 initialize-web-extensions 信号,因此正在设置目录。
然而,即使扩展的 .so 文件位于工作目录(可执行文件也位于该目录)中,它似乎从未被加载。也许我遗漏了什么。
除了几个非常简略的示例之外,我也找不到那么多关于此具体实现的文档。 (我看过了,但没有进一步了解,因为示例代码完全相同)。
希望这里的任何人都有想法。
main.cpp
#include <gtk/gtk.h>
#include <webkit2/webkit2.h>
WebKitWebContext* context;
void initialize_web_extensions(WebKitWebContext* context, gpointer user_data) {
g_print("[webkit2 web-extensions] initialize-web-extensions\n");
webkit_web_context_set_web_extensions_directory(context, ".");
return;
}
int main(int argc, char * argv[])
{
exec_dir = dirname(realpath(argv[0], NULL));
gtk_init(&argc, &argv);
context = webkit_web_context_get_default();
g_signal_connect(context, "initialize-web-extensions", G_CALLBACK(initialize_web_extensions), NULL);
GtkWidget* window_widget;
GtkWindow* window;
window_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
window = GTK_WINDOW(window_widget);
WebKitWebView* webview = WEBKIT_WEB_VIEW(webkit_web_view_new());
GtkWidget* webview_widget = GTK_WIDGET(webview);
webkit_web_view_load_uri(webview, "https://google.com");
gtk_container_add(GTK_CONTAINER(window_widget), webview_widget);
gtk_widget_show_all(window_widget);
gtk_main();
return 0;
}
web_extension.cpp
static void
web_page_created_callback (WebKitWebExtension *extension,
WebKitWebPage *web_page,
gpointer user_data)
{
g_print ("Page %d created for %s\n",
webkit_web_page_get_id (web_page),
webkit_web_page_get_uri (web_page));
}
G_MODULE_EXPORT void
webkit_web_extension_initialize (WebKitWebExtension *extension)
{
g_signal_connect (extension, "page-created",
G_CALLBACK (web_page_created_callback),
NULL);
}
CMakeLists.txt
set(APP_SRCS main.cpp)
set(EXT_SRCS web_extension.cpp)
# Target executable names.
set(TARGET "app")
set(EXT_TARGET "extension")
# find gtk
PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0)
include_directories(${GTK3_INCLUDE_DIRS})
link_directories(${GTK3_LIBRARY_DIRS})
add_definitions(${GTK3_CFLAGS_OTHER})
# include webkitgtk
PKG_CHECK_MODULES(WEBKIT REQUIRED webkit2gtk-4.0 webkit2gtk-web-extension-4.0)
include_directories(${WEBKIT_INCLUDE_DIRS})
link_directories(${WEBKIT_LIBRARY_DIRS})
add_definitions(${WEBKIT_CFLAGS_OTHER})
# add extension
add_library(${EXT_TARGET} SHARED ${EXT_SRCS})
target_link_libraries(${EXT_TARGET} ${WEBKIT_LIBRARIES})
# Executable target.
add_executable(${TARGET} ${APP_SRCS})
SET_EXECUTABLE_TARGET_PROPERTIES(${TARGET})
target_link_libraries(${TARGET} ${EXT_TARGET})
target_link_libraries(${TARGET} ${GTK3_LIBRARIES})
target_link_libraries(${TARGET} ${WEBKIT_LIBRARIES})
显然它与 C++ 编译器中的符号重整有关。必须添加
external "C" {
...
}
明确禁用重整,以便主应用程序可以找到 public 符号。