编译GTK2程序emelfm时遇DSO缺失命令行错误求助
解决emelfm编译时的libgmodule链接错误(GTK3环境下编译GTK2程序)
问题背景
在Gentoo Linux的GTK3环境中编译旧版GTK2文件管理器emelfm,已完成以下修改并生成35个.o文件:
- 修改
Makefile.common,将gtk-config/glib-config替换为pkg-config,指定gtk+-2.0的编译和链接参数 - 修改5个.c文件中的GTK2语法(如
GtkStyle->font、GTK_TEXT()->vadj等)以适配编译
但链接阶段出现以下错误:
gcc -O2 -Wall .... -o emelfm `pkg-config --libs gtk+-2.0` /usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: plugins.o: undefined reference to symbol 'g_module_error' /usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libgmodule-2.0.so.0: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status make: *** [Makefile:22: emelfm] Error 1
快捷解决方案
错误原因是链接命令未显式引入libgmodule-2.0,而emelfm的插件模块依赖该库。只需修改Makefile.common中的链接参数:
将原GLIB_LIB行:
GLIB_LIB = `pkg-config --libs gtk+-2.0`
替换为:
GLIB_LIB = `pkg-config --libs glib-2.0 gmodule-2.0`
或者直接在最终链接命令中追加pkg-config --libs gmodule-2.0,修改后的链接命令应为:
gcc -O2 -Wall .... -o emelfm `pkg-config --libs gtk+-2.0` `pkg-config --libs gmodule-2.0`
执行make clean && make重新编译链接即可解决该DSO错误。
额外建议
- 代码修正注意:你之前对
.c文件的修改(如style_get_active、adj_get_active的用法)并不符合GTK的API规范,只是绕过了编译错误。后续运行程序可能出现功能异常或崩溃,若要长期使用,建议参考GTK3的API文档修正这些代码(例如用gtk_widget_get_style_context()获取样式上下文,再通过gtk_style_context_get_font()获取字体)。 - 原生GTK2编译更顺畅:在Gentoo中可以直接安装GTK2的开发包(
emerge dev-libs/glib:2 x11-libs/gtk+:2),然后用原生GTK2环境编译emelfm,无需修改大量代码,兼容性更好。
内容的提问来源于stack exchange,提问作者Janos Komaromi
相关产品推荐
相关产品推荐

