【发布时间】:2015-03-11 00:00:49
【问题描述】:
我有一个使用模板和回调的共享对象库。 我需要将它移植到另一个使用旧版本 g++ (4.1.2) 的系统。
这是我正在做的伪代码:
shrdPtr.reset( new DataRecvr<T>(aString,boost::bind(&MyClass<T>::myCallBack, this,_1)));
它适用于较新的编译器,但是当我在较旧的系统上构建它时,我在运行时找不到符号。
我使用了 nm mySo.so | c++flt 将不工作的 so 与 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&)
如您所见,旧的编译器在符号中产生了额外的东西,这些东西在运行时没有得到解决。
我在这里缺少什么?
【问题讨论】:
-
您应该复制粘贴类型而不是重新输入它们。另外,您是如何建立类型名称的?
-
类型名称是我构建共享对象的系统的一部分。我只是写了“模板名称”,因为实际类型名称对这个问题没有意义(我认为)。
标签: c++ templates boost callback boost-bind