Как отлаживать расширения WebKit2GTK+
Я пытаюсь заставить работать WebKit2GTK+ Extensions, это простое расширение, которое будет просто печатать в консоли при создании страницы. Вот моя структура проекта:
-bin
-images
-include
-lib
--webextension
---libwebextension.so
---libwebextension.so.1
---libwebextension.so.1.0
---webextension.cpp
-src
--gtk
---gtk_manager.cpp
--main.cpp
Файлы gtk_manager.cpp содержат реализацию файла заголовка, только функция init() будет иметь значение (мы дойдем до этого чуть позже)
webextension.cpp
#include <webkit2/webkit-web-extension.h>
#include <iostream>
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)
{
std::cout << "extension hi\n";
g_signal_connect (extension, "page-created",
G_CALLBACK (web_page_created_callback),
NULL);
}
void hi()
{
g_print("hi");
}
Экспорт и динамическое связывание во время выполнения работы, как я могу назвать hi()
из gtk_manager.cpp's init()
метод. webkit_web_extension_initialize()
не показывает никаких признаков работы / вызова, потому что "extension hi" не выводится в консоль.
gtk_manager.cpp (gtk / gtk.h, glib.h и webkit2/webkit2.h включаются из gtk_manager.h в папку include)
#include "gtk/gtk_manager.h"
#include <iostream>
void initialize_web_extensions(WebKitWebContext*, gpointer);
void GTKManager::init(int argc, char* args[])
{
g_signal_connect(webkit_web_context_get_default(), "initialize-web-extensions", G_CALLBACK(initialize_web_extensions), NULL);
gtk_init(&argc, &args);
/* other code */
}
/* other methods / functions */
void initialize_web_extensions(WebKitWebContext* context, gpointer userData)
{
static guint uniqueId = 0;
webkit_web_context_set_web_extensions_directory(context, "/abs/path/to/app/lib/webextension");
webkit_web_context_set_web_extensions_initialization_user_data(context, g_variant_new_uint32(uniqueId++));
hi(); // This is from webextension.cpp, it is called successfully
}
Я отредактирую этот вопрос, если для поиска решения потребуется дополнительная информация.
Вот ресурсы, которые я использую:
1 ответ
Поскольку это C++, это может быть связано с искажением имени. Попробуйте добавить к функции webkit_web_extension_initialize префикс extern "C". Например:
extern "C" G_MODULE_EXPORT void
webkit_web_extension_initialize (WebKitWebExtension *extension)
{
std::cout << "extension hi\n";
/* your code */
}
Вы можете использовать readelf или objdump, чтобы перечислить все экспортированные символы и посмотреть, есть ли у них искаженные имена.