C++ undefined symbol 错误与 ForceFit

标签 c++ linker undefined-symbol

尝试启动用 C++ 编写的软件(ForceFit,https://aclark.chem.wsu.edu/software/)时出现以下错误:

./ForceFit
./ForceFit: symbol lookup error: ./ForceFit: undefined symbol: _ZN5Gnome5Glade3Xml6createERKSsRKN4Glib7ustringES7_

我无法访问原始代码文件,但搜索了几个问答论坛,找到了一些线索。据我了解,此错误与库有关。这是我到目前为止获得的:

ldd -d -r ForceFit
linux-vdso.so.1 (0x00007fff05fdf000)
libgtkmm-2.4.so.1 => /lib64/libgtkmm-2.4.so.1 (0x00007f1081919000)
libgdkmm-2.4.so.1 => /lib64/libgdkmm-2.4.so.1 (0x00007f10816c9000)
libatkmm-1.6.so.1 => /lib64/libatkmm-1.6.so.1 (0x00007f108147b000)
libgtk-x11-2.0.so.0 => /lib64/libgtk-x11-2.0.so.0 (0x00007f1080df0000)
libpangomm-1.4.so.1 => /lib64/libpangomm-1.4.so.1 (0x00007f1080bc1000)
libcairomm-1.0.so.1 => /lib64/libcairomm-1.0.so.1 (0x00007f108099a000)
libglibmm-2.4.so.1 => /lib64/libglibmm-2.4.so.1 (0x00007f108071c000)
libsigc-2.0.so.0 => /lib64/libsigc-2.0.so.0 (0x00007f1080515000)
libgdk-x11-2.0.so.0 => /lib64/libgdk-x11-2.0.so.0 (0x00007f1080251000)
libatk-1.0.so.0 => /lib64/libatk-1.0.so.0 (0x00007f108002b000)
libpangoft2-1.0.so.0 => /lib64/libpangoft2-1.0.so.0 (0x00007f107fe15000)
libgdk_pixbuf-2.0.so.0 => /lib64/libgdk_pixbuf-2.0.so.0 (0x00007f107fbee000)
libpangocairo-1.0.so.0 => /lib64/libpangocairo-1.0.so.0 (0x00007f107f9e1000)
libcairo.so.2 => /lib64/libcairo.so.2 (0x00007f107f6b8000)
libgio-2.0.so.0 => /lib64/libgio-2.0.so.0 (0x00007f107f337000)
libpango-1.0.so.0 => /lib64/libpango-1.0.so.0 (0x00007f107f0ec000)
libfreetype.so.6 => /usr/lib64/freetype-freeworld/libfreetype.so.6 (0x00007f107ee42000)
libz.so.1 => /lib64/libz.so.1 (0x00007f107ec2b000)
libfontconfig.so.1 => /lib64/libfontconfig.so.1 (0x00007f107e9e7000)
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007f107e795000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f107e590000)
libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007f107e38e000)
librt.so.1 => /lib64/librt.so.1 (0x00007f107e186000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f107de4c000)
libglademm-2.4.so.1 => /lib64/libglademm-2.4.so.1 (0x00007f107dc42000)
libglade-2.0.so.0 => /lib64/libglade-2.0.so.0 (0x00007f107da26000)
libxml2.so.2 => /lib64/libxml2.so.2 (0x00007f107d6bc000)
libm.so.6 => /lib64/libm.so.6 (0x00007f107d3ba000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f107d038000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f107ce20000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f107cc02000)
libc.so.6 => /lib64/libc.so.6 (0x00007f107c841000)
libgiomm-2.4.so.1 => /lib64/libgiomm-2.4.so.1 (0x00007f107c48c000)
libX11.so.6 => /lib64/libX11.so.6 (0x00007f107c14c000)
libXfixes.so.3 => /lib64/libXfixes.so.3 (0x00007f107bf45000)
libpng16.so.16 => /lib64/libpng16.so.16 (0x00007f107bd12000)
libXext.so.6 => /lib64/libXext.so.6 (0x00007f107baff000)
libXrender.so.1 => /lib64/libXrender.so.1 (0x00007f107b8f4000)
libXinerama.so.1 => /lib64/libXinerama.so.1 (0x00007f107b6f0000)
libXi.so.6 => /lib64/libXi.so.6 (0x00007f107b4e0000)
libXrandr.so.2 => /lib64/libXrandr.so.2 (0x00007f107b2d5000)
libXcursor.so.1 => /lib64/libXcursor.so.1 (0x00007f107b0c9000)
libXcomposite.so.1 => /lib64/libXcomposite.so.1 (0x00007f107aec6000)
libXdamage.so.1 => /lib64/libXdamage.so.1 (0x00007f107acc3000)
libthai.so.0 => /lib64/libthai.so.0 (0x00007f107aab9000)
libharfbuzz.so.0 => /lib64/libharfbuzz.so.0 (0x00007f107a857000)
libpixman-1.so.0 => /lib64/libpixman-1.so.0 (0x00007f107a5af000)
libEGL.so.1 => /usr/lib64/nvidia/libEGL.so.1 (0x00007f107a3aa000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f107a1a6000)
libxcb-shm.so.0 => /lib64/libxcb-shm.so.0 (0x00007f1079fa1000)
libxcb-render.so.0 => /lib64/libxcb-render.so.0 (0x00007f1079d97000)
libxcb.so.1 => /lib64/libxcb.so.1 (0x00007f1079b75000)
libGL.so.1 => /usr/lib64/nvidia/libGL.so.1 (0x00007f1079840000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f107961d000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f1079402000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f10791f1000)
libexpat.so.1 => /lib64/libexpat.so.1 (0x00007f1078fc7000)
libffi.so.6 => /lib64/libffi.so.6 (0x00007f1078dbe000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f1078b98000)
/lib64/ld-linux-x86-64.so.2 (0x0000563a7c108000)
libdatrie.so.1 => /lib64/libdatrie.so.1 (0x00007f107898f000)
libgraphite2.so.3 => /lib64/libgraphite2.so.3 (0x00007f1078763000)
libGLdispatch.so.0 => /usr/lib64/nvidia/libGLdispatch.so.0 (0x00007f10784ca000)
libXau.so.6 => /lib64/libXau.so.6 (0x00007f10782c6000)
libnvidia-tls.so.358.16 => /usr/lib64/nvidia/tls/libnvidia-tls.so.358.16 (0x00007f10780c2000)
libnvidia-glcore.so.358.16 => /usr/lib64/nvidia/libnvidia-glcore.so.358.16 (0x00007f1076460000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f10761ed000)
undefined symbol: _ZN5Gnome5Glade3Xml6createERKSsRKN4Glib7ustringES7_   (./ForceFit)
undefined symbol: _ZN4Glib7ustringC1ERKSs   (./ForceFit)

其中列出了可执行文件无法找到的符号。对这些符号名称进一步运行 c++filt 会产生以下结果:

c++filt _ZN5Gnome5Glade3Xml6createERKSsRKN4Glib7ustringES7_
Gnome::Glade::Xml::create(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Glib::ustring const&, Glib::ustring const&)

c++filt _ZN4Glib7ustringC1ERKSs
Glib::ustring::ustring(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

不幸的是,我没有找到解决这个问题需要哪些步骤,而且我自己也不熟悉 C++。可执行文件的网站指定它依赖于我安装的 G++/c++ 编译器以及 libglade 和 gtkmm 库。如果相关的话,我正在使用 Gnome 3 运行 Fedora 23。

感谢您的帮助!

最佳答案

您链接到的包似乎是一个打包得很糟糕的 tarball。 tarball 不仅包含源代码,还包含编译后的目标模块和可执行文件。

您可能试图直接执行从 tarball 中解压缩的二进制文件。

显然,该二进制文件是基于其他某个大约 2011 年左右的古老 Linux 发行版构建的,而不是您尝试在其上运行的发行版。当然,它链接到您没有的共享库,并且您看到的是这种草率打包代码的结果。

您需要从源代码重建整个代码,假设它完全可以构建。

关于C++ undefined symbol 错误与 ForceFit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38073719/

相关文章:

java - 将 Java 类实例绑定(bind)到 C++ 类实例

c++ - 查找函数指针的实现

linker - 运行时链接器忽略 Solaris 上可执行文件中的 RPATH

c++ - 未定义对 'function' 的引用——链接器问题?

c++ - 如何使用 -v 调用查看有关 cmake 链接器错误( undefined symbol )的详细信息?

c++ - undefined symbol 体系结构 x86_64 的 undefined symbol : "_kCFAllocatorDefault"

c++ - 指针列表的总和

c++ - QPushButton 中的两种颜色文本

c++ - OpenCV 未定义引用(带 vector 的 FileStorage<KeyPoint>)

c - Solaris 上的 ppoll