我有一个使用模板和回调的共享对象库。 我需要将它移植到另一个使用旧版g ++(4.1.2)的系统。
这是我正在做的伪代码:
shrdPtr.reset( new DataRecvr<T>(aString,boost::bind(&MyClass<T>::myCallBack, this,_1)));
它适用于较新的编译器,但是当我在旧系统上构建它时,我在运行时找不到符号。
我用过nm mySo.so | c ++ flt比较und和ldd -u -r mySo.so
在较新的编译器(g ++ 4.4.7)上,它产生:
DataRecvr<TemplateName>::DataRecvr(std::basic_string<char,std::char_traits<char>,std::allocator<cahr> >const&, boost::function1,void,shrdPtr<TemplateName>&> const&
在较旧的编译器上产生:
DataRecvr<TemplateName>::DataRecvr(std::basic_string<char,std::char_traits<char>,std::allocator<char> >const&, boost::function1,void,shrdPtr<TemplateName>& std::allocator<boost::function_base> >const&)
正如您所看到的,较旧的编译器在符号中产生了额外的东西,这些东西在运行时没有得到解析。
我在这里缺少什么?
答案 0 :(得分:0)
似乎我包括了旧版本的提升。给我带来问题的系统有多个版本的提升。当我将include路径设置为boost_144时,我的问题就消失了。也许旧版本的boost会使用与我正在使用的构造函数不兼容的绑定做奇怪的事情。