我正在尝试编译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文件中未定义。那么他们应该在哪里定义?
答案 0 :(得分:0)
好吧,我解决了编译问题,但这又产生了另一个问题:
19 Aug 23 21:39 libstdc++.so -> libstdc++.so.6.0.20
18 Sep 3 2016 libstdc++.so.5 -> libstdc++.so.5.0.7
4515618 Jun 5 2013 libstdc++.so.5.0.7
19 Sep 3 2016 libstdc++.so.6 -> libstdc++.so.6.0.21
966848 Jul 30 2012 libstdc++.so.6.0.17
1003520 Aug 19 2015 libstdc++.so.6.0.20
1533144 Mar 7 2016 libstdc++.so.6.0.21
我不久前更新了libstdc++
后,版本从6.0.20
增加到6.0.21
,即使手动调用ldconfig
后,libstdc++.so
仍指向6.0.20
版本。手动将此链接更改为6.0.21
即可解决问题。
我的印象是ldconfig
应该照顾这个。手册页和搜索都没有显示确切的算法ldconfig
如下......我在这里错了吗?