【问题标题】:boost::bind seems to produce different symbols with different compilers?boost::bind 似乎使用不同的编译器产生不同的符号?
【发布时间】: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&lt;TemplateName&gt;::DataRecvr(std::basic_string&lt;char,std::char_traits&lt;char&gt;,std::allocator&lt;cahr&gt; &gt;const&amp;, boost::function1,void,shrdPtr&lt;TemplateName&gt;&amp;&gt; const&amp;

在较旧的编译器上,它会产生: DataRecvr&lt;TemplateName&gt;::DataRecvr(std::basic_string&lt;char,std::char_traits&lt;char&gt;,std::allocator&lt;char&gt; &gt;const&amp;, boost::function1,void,shrdPtr&lt;TemplateName&gt;&amp; std::allocator&lt;boost::function_base&gt; &gt;const&amp;)

如您所见,旧的编译器在符号中产生了额外的东西,这些东西在运行时没有得到解决。

我在这里缺少什么?

【问题讨论】:

  • 您应该复制粘贴类型而不是重新输入它们。另外,您是如何建立类型名称的?
  • 类型名称是我构建共享对象的系统的一部分。我只是写了“模板名称”,因为实际类型名称对这个问题没有意义(我认为)。

标签: c++ templates boost callback boost-bind


【解决方案1】:

似乎我包含了旧版本的 boost。给我带来问题的系统有多个版本的提升。当我将包含路径设置为 boost_144 时,我的问题就消失了。也许旧版本的 boost 使用与我正在使用的构造函数不兼容的 bind 做了一些奇怪的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2021-12-10
    • 2020-04-23
    • 2019-07-08
    • 1970-01-01
    相关资源
    最近更新 更多