boost::serialization 分段错误

boost::serialization segmentation fault

尝试使用 boost::serialization 文本或带有字符串或文件流的二进制存档来编译任何程序我遇到分段错误。即使是像这样的简单代码:

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <sstream>

int main()
{
  std::stringstream ss;
  {
    try
    {
      boost::archive::binary_oarchive oa(ss);
    }
    catch(...) {}
  }
}

错误:

received signal SIGSEGV, Segmentation fault.
In ?? () ()
#1  0x00007ffff79ad770 in sputn (__n=8, __s=0x7fffffffd990 "6", this=<optimized out>) at /usr/include/c++/4.8/streambuf:451
/usr/include/c++/4.8/streambuf:451:15915:beg:0x7ffff79ad770
At /usr/include/c++/4.8/streambuf:451
#1  0x00007ffff79ad770 in sputn (__n=8, __s=0x7fffffffd990 "6", this=<optimized out>) at /usr/include/c++/4.8/streambuf:451
/usr/include/c++/4.8/streambuf:451:15915:beg:0x7ffff79ad770

Boost 1.59 安装在 Ubuntu 上

./bootstrap.sh -prefix=/usr
sudo ./b2 install

为什么可以这样?

在 ubuntu 上手动安装 boost 后,程序 link 使用了错误的库。还有一个 boost 副本,安装在 /usr/lib/x86_64-linux-gnu 目录中,它对 linker 具有更高的优先级。在 Ubuntu 上,来自存储库的默认 boost 安装是多架构的,Intel 处理器的 64 位版本安装在 /usr/lib/x86_64-linux-gnu 中,并且可能是同一台机器上多个体系结构的多个版本。

作为简单手动增强安装的变体(1.59 的实际情况):

./bootstrap.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu
sudo ./b2 install

bash shell 来自 boost 解压源目录的命令。

这将在标准目录中安装 boost,并由存储库中的标准 boost 包使用。 (并且可能会导致与标准包的一些冲突)

或者在某个目录中安装 boost,并通过某种标准方式使 linker 可见。或者 link 直接到安装的库,例如使用 /usr/lib/libboost_serialization.so 或 /usr/lib/libboost_serialization.a 而不是 -lboost_serialization link 其他选项。

感谢大家的帮助。