尝试链接共享库( gtkmm )时,我的签名包含std::string const&
的函数会出现链接器错误。
例如,如果函数声明为
void set_icon_from_file(const std::string&);
g ++报告
undefined reference to `Gtk::Window::set_icon_from_file(std::string const&)'
我正在使用来自pkg-config
的链接器标志,对于其他函数(例如,将原始类型作为参数的函数)不会发生这种情况,因此我怀疑链接器配置正确。
readelf
给了我
45: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _ZN3Gtk6Window18set_icon_from_fileERKSs
并在共享库
上10991: 00000000003c0950 96 FUNC GLOBAL DEFAULT 11 _ZN3Gtk6Window18set_icon_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
我不知道该怎么做。我检查了函数是在库头文件和源代码中使用相同的签名声明的。由于错误名称中的__cxx11
部分,我首先怀疑C ++版本之间的兼容性问题,但是,我也在使用C ++ 11构建。
答案 0 :(得分:3)
看看我的c ++ - filt输出:
_ZN3Gtk6Window18set_icon_from_fileERKSs
Gtk::Window::set_icon_from_file(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
_ZN3Gtk6Window18set_icon_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Gtk::Window::set_icon_from_file(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
这意味着第二个版本是在启用glibcxx11 abi的情况下编译的。 Here有关它的更多信息。
因此,基本上您需要将gcc更新为5.1版本或降级库。