【发布时间】:2018-02-01 17:18:43
【问题描述】:
我正在尝试编译 gobby,但编译因以下错误而停止:
/usr/lib64/gcc/x86_64-slackware-linux/4.9.3/../../../../lib64/libglibmm-2.4.so: undefined reference to `std::out_of_range::out_of_range(char const*)@GLIBCXX_3.4.21'
/usr/lib64/gcc/x86_64-slackware-linux/4.9.3/../../../../lib64/libglibmm-2.4.so: undefined reference to `std::underflow_error::underflow_error(char const*)@GLIBCXX_3.4.21'
/usr/lib64/gcc/x86_64-slackware-linux/4.9.3/../../../../lib64/libglibmm-2.4.so: undefined reference to `std::overflow_error::overflow_error(char const*)@GLIBCXX_3.4.21'
第一反应是检查链接命令。结局是这样的:
... -lgsasl -lgnutls -lgtkmm-3.0 -latkmm-1.6 -lgdkmm-3.0 -lgiomm-2.4 -lpangomm-1.4 **-lglibmm-2.4** -lcairomm-1.0 -lsigc-2.0 -lgtksourceview-3.0 -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -linfgtk-0.7 -linftextgtk-0.7 -linftext-0.7 -linfinity-0.7 -lxml2 -lgnutls -lgsasl -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
(我用** 标记了-lglibmm-2.4 库。我怀疑应该在这里定义标识符。为了确保我跑了:
$ objdump -TC libglibmm-2.4.so.1.3.0 | grep out_of_range
0000000000000000 DF *UND* 0000000000000000 GLIBCXX_3.4.21 std::out_of_range::out_of_range(char const*)
0000000000000000 DF *UND* 0000000000000000 GLIBCXX_3.4 std::out_of_range::~out_of_range()
0000000000000000 DF *UND* 0000000000000000 GLIBCXX_3.4.20 std::__throw_out_of_range_fmt(char const*, ...)
0000000000000000 DO *UND* 0000000000000000 GLIBCXX_3.4 typeinfo for std::out_of_range
$ objdump -TC libglibmm-2.4.so.1.3.0 | grep overflow_error
0000000000000000 DF *UND* 0000000000000000 GLIBCXX_3.4.21 std::overflow_error::overflow_error(char const*)
0000000000000000 DF *UND* 0000000000000000 GLIBCXX_3.4 std::overflow_error::~overflow_error()
0000000000000000 DO *UND* 0000000000000000 GLIBCXX_3.4 typeinfo for std::overflow_error
因此,它们似乎在 .so 文件中未定义。那么应该在哪里定义呢?
【问题讨论】:
-
@RinatVeliakhmedov,我刚刚运行了 ./configure 和 make - tar.gz 中的原始文件没有进行任何更改
-
您是否链接到为不同平台预先构建的内容?那是我以前见过这样的问题的时候。
-
@xaxxon,不确定你在问什么 - 交叉编译?一切都是“本机”的,我正在 x86_64 上编译,这也是目的地。
-
否,您是否下载了未专门针对您所在的确切平台编译的预编译库?就像为不同版本的 ubuntu 抢一个,而不是你正在运行的(或其他)
-
@xaxxon 好的。我正在使用 Slackware,所以基本上我会编译所有内容。如果有的话,我会使用来自 Slackbuilds.org 的优秀“食谱”,但在这种情况下,那里的虾虎鱼版本有些过时了。可悲的是,我需要的软件也经常在那里不可用,所以我不得不依靠编译。
标签: c++ std undefined-reference