Failure to link with lld on OpenBSD
When building Remmina 1.2.0rc29 on OpenBSD 6.3 with LLD 6.0.0 it fails to link:
[1/1] : && /usr/ports/pobj/remmina-1.2.0rc29/bin/cc -O2 -pipe -I/usr/X11R6/include -I/usr/local/include -DNDEBUG -rdynamic remmina/CMakeFiles/remmina.dir/src/remmina_about.c.o remmina/CMakeFiles/remmina.dir/src/remmina_applet_menu.c.o remmina/CMakeFiles/remmina.dir/src/remmina_applet_menu_item.c.o remmina/CMakeFiles/remmina.dir/src/remmina_avahi.c.o remmina/CMakeFiles/remmina.dir/src/remmina.c.o remmina/CMakeFiles/remmina.dir/src/remmina_chat_window.c.o remmina/CMakeFiles/remmina.dir/src/remmina_crypt.c.o remmina/CMakeFiles/remmina.dir/src/remmina_exec.c.o remmina/CMakeFiles/remmina.dir/src/remmina_file.c.o remmina/CMakeFiles/remmina.dir/src/remmina_file_editor.c.o remmina/CMakeFiles/remmina.dir/src/remmina_file_manager.c.o remmina/CMakeFiles/remmina.dir/src/remmina_ftp_client.c.o remmina/CMakeFiles/remmina.dir/src/remmina_icon.c.o remmina/CMakeFiles/remmina.dir/src/remmina_init_dialog.c.o remmina/CMakeFiles/remmina.dir/src/remmina_key_chooser.c.o remmina/CMakeFiles/remmina.dir/src/remmina_log.c.o remmina/CMakeFiles/remmina.dir/src/remmina_main.c.o remmina/CMakeFiles/remmina.dir/src/remmina_marshals.c.o remmina/CMakeFiles/remmina.dir/src/remmina_masterthread_exec.c.o remmina/CMakeFiles/remmina.dir/src/remmina_plugin_manager.c.o remmina/CMakeFiles/remmina.dir/src/remmina_ext_exec.c.o remmina/CMakeFiles/remmina.dir/src/remmina_pref.c.o remmina/CMakeFiles/remmina.dir/src/remmina_pref_dialog.c.o remmina/CMakeFiles/remmina.dir/src/remmina_protocol_widget.c.o remmina/CMakeFiles/remmina.dir/src/remmina_public.c.o remmina/CMakeFiles/remmina.dir/src/remmina_scrolled_viewport.c.o remmina/CMakeFiles/remmina.dir/src/remmina_sftp_client.c.o remmina/CMakeFiles/remmina.dir/src/remmina_sftp_plugin.c.o remmina/CMakeFiles/remmina.dir/src/remmina_ssh.c.o remmina/CMakeFiles/remmina.dir/src/remmina_ssh_plugin.c.o remmina/CMakeFiles/remmina.dir/src/remmina_string_array.c.o remmina/CMakeFiles/remmina.dir/src/remmina_string_list.c.o remmina/CMakeFiles/remmina.dir/src/remmina_utils.c.o remmina/CMakeFiles/remmina.dir/src/remmina_widget_pool.c.o remmina/CMakeFiles/remmina.dir/src/remmina_external_tools.c.o remmina/CMakeFiles/remmina.dir/src/remmina_sysinfo.c.o remmina/CMakeFiles/remmina.dir/src/remmina_connection_window.c.o remmina/CMakeFiles/remmina.dir/src/remmina_mpchange.c.o remmina/CMakeFiles/remmina.dir/src/remmina_stats.c.o remmina/CMakeFiles/remmina.dir/src/remmina_stats_sender.c.o -o remmina/remmina -L/usr/local/lib -L/usr/X11R6/lib -Wl,-rpath,/usr/local/lib: -lgtk-3 -lgdk-3 -lglib-2.0 -lgio-2.0 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lpango-1.0 -lcairo -lgdk_pixbuf-2.0 -latk-1.0 -lSM -lICE -lX11 -lXext -lpthread -lssh -lssh_threads -lgcrypt -lavahi-common -lavahi-client -lavahi-ui-gtk3 -lssl -lcrypto -lvte-2.91 -ljson-glib-1.0 -lsoup-2.4 -Wl,-rpath-link,/usr/X11R6/lib:/usr/local/lib && :
FAILED: remmina/remmina
: && /usr/ports/pobj/remmina-1.2.0rc29/bin/cc -O2 -pipe -I/usr/X11R6/include -I/usr/local/include -DNDEBUG -rdynamic remmina/CMakeFiles/remmina.dir/src/remmina_about.c.o remmina/CMakeFiles/remmina.dir/src/remmina_applet_menu.c.o remmina/CMakeFiles/remmina.dir/src/remmina_applet_menu_item.c.o remmina/CMakeFiles/remmina.dir/src/remmina_avahi.c.o remmina/CMakeFiles/remmina.dir/src/remmina.c.o remmina/CMakeFiles/remmina.dir/src/remmina_chat_window.c.o remmina/CMakeFiles/remmina.dir/src/remmina_crypt.c.o remmina/CMakeFiles/remmina.dir/src/remmina_exec.c.o remmina/CMakeFiles/remmina.dir/src/remmina_file.c.o remmina/CMakeFiles/remmina.dir/src/remmina_file_editor.c.o remmina/CMakeFiles/remmina.dir/src/remmina_file_manager.c.o remmina/CMakeFiles/remmina.dir/src/remmina_ftp_client.c.o remmina/CMakeFiles/remmina.dir/src/remmina_icon.c.o remmina/CMakeFiles/remmina.dir/src/remmina_init_dialog.c.o remmina/CMakeFiles/remmina.dir/src/remmina_key_chooser.c.o remmina/CMakeFiles/remmina.dir/src/remmina_log.c.o remmina/CMakeFiles/remmina.dir/src/remmina_main.c.o remmina/CMakeFiles/remmina.dir/src/remmina_marshals.c.o remmina/CMakeFiles/remmina.dir/src/remmina_masterthread_exec.c.o remmina/CMakeFiles/remmina.dir/src/remmina_plugin_manager.c.o remmina/CMakeFiles/remmina.dir/src/remmina_ext_exec.c.o remmina/CMakeFiles/remmina.dir/src/remmina_pref.c.o remmina/CMakeFiles/remmina.dir/src/remmina_pref_dialog.c.o remmina/CMakeFiles/remmina.dir/src/remmina_protocol_widget.c.o remmina/CMakeFiles/remmina.dir/src/remmina_public.c.o remmina/CMakeFiles/remmina.dir/src/remmina_scrolled_viewport.c.o remmina/CMakeFiles/remmina.dir/src/remmina_sftp_client.c.o remmina/CMakeFiles/remmina.dir/src/remmina_sftp_plugin.c.o remmina/CMakeFiles/remmina.dir/src/remmina_ssh.c.o remmina/CMakeFiles/remmina.dir/src/remmina_ssh_plugin.c.o remmina/CMakeFiles/remmina.dir/src/remmina_string_array.c.o remmina/CMakeFiles/remmina.dir/src/remmina_string_list.c.o remmina/CMakeFiles/remmina.dir/src/remmina_utils.c.o remmina/CMakeFiles/remmina.dir/src/remmina_widget_pool.c.o remmina/CMakeFiles/remmina.dir/src/remmina_external_tools.c.o remmina/CMakeFiles/remmina.dir/src/remmina_sysinfo.c.o remmina/CMakeFiles/remmina.dir/src/remmina_connection_window.c.o remmina/CMakeFiles/remmina.dir/src/remmina_mpchange.c.o remmina/CMakeFiles/remmina.dir/src/remmina_stats.c.o remmina/CMakeFiles/remmina.dir/src/remmina_stats_sender.c.o -o remmina/remmina -L/usr/local/lib -L/usr/X11R6/lib -Wl,-rpath,/usr/local/lib: -lgtk-3 -lgdk-3 -lglib-2.0 -lgio-2.0 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lpango-1.0 -lcairo -lgdk_pixbuf-2.0 -latk-1.0 -lSM -lICE -lX11 -lXext -lpthread -lssh -lssh_threads -lgcrypt -lavahi-common -lavahi-client -lavahi-ui-gtk3 -lssl -lcrypto -lvte-2.91 -ljson-glib-1.0 -lsoup-2.4 -Wl,-rpath-link,/usr/X11R6/lib:/usr/local/lib && :
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_about.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_about.c.o:(remmina_about_open)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_applet_menu_item.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_applet_menu_item.c.o:(remmina_applet_menu_item_new)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_applet_menu_item.c
/usr/bin/ld: error: undefined symbol: libintl_bindtextdomain
>>> referenced by remmina.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina.c.o:(main)
/usr/bin/ld: error: undefined symbol: libintl_bind_textdomain_codeset
>>> referenced by remmina.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina.c.o:(main)
/usr/bin/ld: error: undefined symbol: libintl_textdomain
>>> referenced by remmina.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina.c.o:(main)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_chat_window.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_chat_window.c.o:(remmina_chat_window_new)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_chat_window.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_chat_window.c.o:(remmina_chat_window_new)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_chat_window.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_chat_window.c.o:(remmina_chat_window_new)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_exec.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_exec.c.o:(remmina_exec_command)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_file_editor.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_file_editor.c.o:(remmina_file_editor_init)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_file_editor.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_file_editor.c.o:(remmina_file_editor_init)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_file_editor.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_file_editor.c.o:(remmina_file_editor_init)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_file_editor.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_file_editor.c.o:(remmina_file_editor_init)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_file_editor.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_file_editor.c.o:(remmina_file_editor_new_from_file)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_file_editor.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_file_editor.c.o:(remmina_file_editor_new_from_file)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_file_editor.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_file_editor.c.o:(remmina_file_editor_new_from_file)
/usr/bin/ld: error: undefined symbol: libintl_gettext
>>> referenced by remmina_file_editor.c
>>> remmina/CMakeFiles/remmina.dir/src/remmina_file_editor.c.o:(remmina_file_editor_new_from_file)
/usr/bin/ld: error: too many errors emitted, stopping now (use -error-limit=0 to see all errors)
cc: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
This is resolved by explicitly configuring with -DCMAKE_EXE_LINKER_FLAGS="-lintl"
however wouldn't it be better to use FindGettext
or the like to determine if remmina needs to link with -lintl
?
You see, when you call a library function from your program, say, libintl_gettext, you need to explicitly link in the library that provides this function (here libintl on OpenBSD, thus cc ... -lintl). With the ancient binutils 2.17 that most of OpenBSD's architectures still use, it is sufficient if some other library libfoo indirectly pulls in the required library. This no longer works with lld, which is LLVM’s new linker.