naqvis / webview

Crystal bindings to Webview library
MIT License
93 stars 8 forks source link

Build on Ubuntu 22.04 failed #11

Closed petr-fischer closed 1 year ago

petr-fischer commented 1 year ago

I have no idea what's going on - an incompatible version of webkit? Do you need another debug output? Send me the commands.

If I try to compile this:

require "webview"

wv = Webview.window(640, 480, Webview::SizeHints::NONE, "Hello WebView", "http://crystal-lang.org")
wv.run
wv.destroy

following error occurs:

➤  crystal build hello.cr
/usr/bin/ld: /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a(webview.o): in function `webview::gtk_webkit_engine::gtk_webkit_engine(bool, void*)::{lambda(_WebKitUserContentManager*, _WebKitJavascriptResult*, void*)#2}::operator()(_WebKitUserContentManager*, _WebKitJavascriptResult*, void*) const':
webview.cc:(.text._ZZN7webview17gtk_webkit_engineC4EbPvENKUlP25_WebKitUserContentManagerP23_WebKitJavascriptResultS1_E0_clES3_S5_S1_[_ZZN7webview17gtk_webkit_engineC4EbPvENKUlP25_WebKitUserContentManagerP23_WebKitJavascriptResultS1_E0_clES3_S5_S1_]+0x3e): undefined reference to `webkit_javascript_result_get_js_value'
/usr/bin/ld: webview.cc:(.text._ZZN7webview17gtk_webkit_engineC4EbPvENKUlP25_WebKitUserContentManagerP23_WebKitJavascriptResultS1_E0_clES3_S5_S1_[_ZZN7webview17gtk_webkit_engineC4EbPvENKUlP25_WebKitUserContentManagerP23_WebKitJavascriptResultS1_E0_clES3_S5_S1_]+0x4e): undefined reference to `jsc_value_to_string'
/usr/bin/ld: webview.cc:(.text._ZZN7webview17gtk_webkit_engineC4EbPvENKUlP25_WebKitUserContentManagerP23_WebKitJavascriptResultS1_E0_clES3_S5_S1_[_ZZN7webview17gtk_webkit_engineC4EbPvENKUlP25_WebKitUserContentManagerP23_WebKitJavascriptResultS1_E0_clES3_S5_S1_]+0xb4): undefined reference to `g_free'
/usr/bin/ld: /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a(webview.o): in function `webview::gtk_webkit_engine::gtk_webkit_engine(bool, void*)':
webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x4e): undefined reference to `gtk_init_check'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x71): undefined reference to `gtk_window_new'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x9d): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0xc5): undefined reference to `g_signal_connect_data'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0xca): undefined reference to `webkit_web_view_new'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0xd7): undefined reference to `webkit_web_view_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0xed): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0xf5): undefined reference to `webkit_web_view_get_user_content_manager'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x131): undefined reference to `g_signal_connect_data'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x147): undefined reference to `webkit_user_content_manager_register_script_message_handler'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x19d): undefined reference to `gtk_widget_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x1b3): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x1bb): undefined reference to `gtk_container_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x1d1): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x1dc): undefined reference to `gtk_container_add'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x1e1): undefined reference to `gtk_widget_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x1f7): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x1ff): undefined reference to `gtk_widget_grab_focus'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x204): undefined reference to `webkit_web_view_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x21a): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x222): undefined reference to `webkit_web_view_get_settings'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x237): undefined reference to `webkit_settings_set_javascript_can_access_clipboard'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x24e): undefined reference to `webkit_settings_set_enable_write_console_messages_to_stdout'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x25f): undefined reference to `webkit_settings_set_enable_developer_extras'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engineC2EbPv[_ZN7webview17gtk_webkit_engineC5EbPv]+0x26f): undefined reference to `gtk_widget_show_all'
/usr/bin/ld: /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a(webview.o): in function `webview::gtk_webkit_engine::run()':
webview.cc:(.text._ZN7webview17gtk_webkit_engine3runEv[_ZN7webview17gtk_webkit_engine3runEv]+0x11): undefined reference to `gtk_main'
/usr/bin/ld: /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a(webview.o): in function `webview::gtk_webkit_engine::terminate()':
webview.cc:(.text._ZN7webview17gtk_webkit_engine9terminateEv[_ZN7webview17gtk_webkit_engine9terminateEv]+0x11): undefined reference to `gtk_main_quit'
/usr/bin/ld: /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a(webview.o): in function `webview::gtk_webkit_engine::dispatch(std::function<void ()>)':
webview.cc:(.text._ZN7webview17gtk_webkit_engine8dispatchESt8functionIFvvEE[_ZN7webview17gtk_webkit_engine8dispatchESt8functionIFvvEE]+0x6c): undefined reference to `g_idle_add_full'
/usr/bin/ld: /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a(webview.o): in function `webview::gtk_webkit_engine::set_title(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
webview.cc:(.text._ZN7webview17gtk_webkit_engine9set_titleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine9set_titleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x25): undefined reference to `gtk_window_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine9set_titleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine9set_titleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x3b): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine9set_titleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine9set_titleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x46): undefined reference to `gtk_window_set_title'
/usr/bin/ld: /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a(webview.o): in function `webview::gtk_webkit_engine::set_size(int, int, int)':
webview.cc:(.text._ZN7webview17gtk_webkit_engine8set_sizeEiii[_ZN7webview17gtk_webkit_engine8set_sizeEiii]+0x34): undefined reference to `gtk_window_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8set_sizeEiii[_ZN7webview17gtk_webkit_engine8set_sizeEiii]+0x4a): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8set_sizeEiii[_ZN7webview17gtk_webkit_engine8set_sizeEiii]+0x54): undefined reference to `gtk_window_set_resizable'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8set_sizeEiii[_ZN7webview17gtk_webkit_engine8set_sizeEiii]+0x5f): undefined reference to `gtk_window_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8set_sizeEiii[_ZN7webview17gtk_webkit_engine8set_sizeEiii]+0x75): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8set_sizeEiii[_ZN7webview17gtk_webkit_engine8set_sizeEiii]+0x88): undefined reference to `gtk_window_resize'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8set_sizeEiii[_ZN7webview17gtk_webkit_engine8set_sizeEiii]+0xab): undefined reference to `gtk_widget_set_size_request'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8set_sizeEiii[_ZN7webview17gtk_webkit_engine8set_sizeEiii]+0xdf): undefined reference to `gtk_window_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8set_sizeEiii[_ZN7webview17gtk_webkit_engine8set_sizeEiii]+0xf5): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8set_sizeEiii[_ZN7webview17gtk_webkit_engine8set_sizeEiii]+0x10e): undefined reference to `gtk_window_set_geometry_hints'
/usr/bin/ld: /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a(webview.o): in function `webview::gtk_webkit_engine::navigate(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
webview.cc:(.text._ZN7webview17gtk_webkit_engine8navigateENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine8navigateENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x25): undefined reference to `webkit_web_view_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8navigateENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine8navigateENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x3b): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine8navigateENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine8navigateENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x46): undefined reference to `webkit_web_view_load_uri'
/usr/bin/ld: /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a(webview.o): in function `webview::gtk_webkit_engine::init(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
webview.cc:(.text._ZN7webview17gtk_webkit_engine4initENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine4initENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x15): undefined reference to `webkit_web_view_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine4initENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine4initENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x2b): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine4initENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine4initENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x33): undefined reference to `webkit_web_view_get_user_content_manager'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine4initENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine4initENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x60): undefined reference to `webkit_user_script_new'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine4initENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine4initENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x72): undefined reference to `webkit_user_content_manager_add_script'
/usr/bin/ld: /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a(webview.o): in function `webview::gtk_webkit_engine::eval(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
webview.cc:(.text._ZN7webview17gtk_webkit_engine4evalENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine4evalENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x25): undefined reference to `webkit_web_view_get_type'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine4evalENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine4evalENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x3b): undefined reference to `g_type_check_instance_cast'
/usr/bin/ld: webview.cc:(.text._ZN7webview17gtk_webkit_engine4evalENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN7webview17gtk_webkit_engine4evalENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x56): undefined reference to `webkit_web_view_run_javascript'
collect2: error: ld returned 1 exit status
Error: execution of command failed with code: 1: `cc "${@}" -o /home/pf/Work/Crystal/tests/webview-test/hello  -rdynamic -L/usr/bin/../lib/crystal `command -v pkg-config > /dev/null && pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0` /home/pf/Work/Crystal/tests/webview-test/lib/webview/src/../ext/libwebview.a -lstdc++ -lm -lgc -lpthread -levent -lrt -lpthread -ldl`
Ubuntu: 22.04.1 LTS (Jammy Jellyfish)
Crystal: 1.6.0
libwebkit: libwebkit2gtk-4.0-37 (also libwebkit2gtk-4.0-dev is installed)
naqvis commented 1 year ago

....... undefined reference to `webkit_javascript_result_get_js_value' .....

Seems you have missing dependencies. Can you please check your system if you have libgtk-3-dev installed?

sudo apt-get install libgtk-3-dev libwebkit2gtk-4.0-dev
petr-fischer commented 1 year ago

Yes, I had both already installed.

libgtk-3-dev/jammy-updates,now 3.24.33-1ubuntu2 amd64 [installed]
libwebkit2gtk-4.0-dev/jammy-updates,jammy-security,now 2.36.8-0ubuntu0.22.04.1 amd64 [installed]
naqvis commented 1 year ago

Can you run below command to ensure pkg-config is able to find these dependencies?

pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0
petr-fischer commented 1 year ago

➤ pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0 -pthread -I/usr/include/webkitgtk-4.0 -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/x86_64-linux-gnu -I/usr/include/libsoup-2.4 -I/usr/include/libxml2 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/webkitgtk-4.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lwebkit2gtk-4.0 -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lsoup-2.4 -Wl,--export-dynamic -lgmodule-2.0 -pthread -lgio-2.0 -ljavascriptcoregtk-4.0 -lgobject-2.0 -lglib-2.0

naqvis commented 1 year ago

I don't have access to Ubuntu 22 box, so unable to reproduce. You can try to install original library https://github.com/webview/webview or any of its bindings to validate if its dependencies issue or anything specific to this binding.

sourceweaver commented 1 year ago

@petr-fischer I've had the same issue with Debian 11, the suggested fix in #4 has worked for me. After you download the library with shards install, edit the local copy of lib.cr and find the lines:

https://github.com/naqvis/webview/blob/d302ffaf84b51e31a3eced48e188cbc5faafe6e3/src/lib.cr#L6-L7

And re-order these annotations to be:

@[Link(ldflags: "`command -v pkg-config > /dev/null && pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0`")]
@[Link(ldflags: "#{__DIR__}/../ext/libwebview.a -lstdc++")]

After this tweak, you should be able to compile your program.

For @naqvis:

It looks like #4 and #11 are connected, and the fix seems to have helped others. Do you think this change should be made upstream?

petr-fischer commented 1 year ago

After this tweak, you should be able to compile your program.

Yes! That works - thanks.

naqvis commented 1 year ago

@sourceweaver appreciate if you can push a PR with above fix.