1

我一直在构建一个 C++ 库,我想将它作为单个 .so 文件分发给我的用户,并希望该 .so 文件在大多数情况下与发行版无关。因此,我一直在静态链接第 3 方库(但仍然动态链接到标准库)

现在它在 CentOS 6.2(64 位)上使用 g++ 构建良好,但在 CentOS 5.3 上构建时遇到问题。编译正常,但出现链接器错误:

cpu_timer.cpp:(.text+0x288): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<long double>(long double)'

我已经对错误进行了一些搜索,这似乎是标准库本身的版本控制问题。我的代码,或者更确切地说是 boost::thread 的代码,正在尝试调用 CentOS 5.3 中包含的标准库中不存在的新版本。

可以理解。所以我需要:

  • 静态链接到 C++ 标准库(我已经对此进行了一些研究,这对 64 位系统来说是一个巨大的痛苦。大多数 64 位系统中包含的 libstdc++.a 不是使用 -fPIC 构建的,而-fPIC 实际上是必须在 64 位系统上进行静态链接。我必须自己构建 libstdc++.a。呃...
  • 将 boost::timer 恢复为更兼容的版本。我主要将它用于便携式互斥锁,所以我不需要前沿的 boost::thread 功能。但这有其自身的问题:在 boost 网站上,他们在哪里记录了他们对标准库的依赖关系(以及哪些版本)。他们有记录吗?我好像找不到资料。另外,这是一个明智的选择吗?标准库还能给我带来哪些令人讨厌的惊喜?

鉴于我的目标(尽可能接近发行版不可知论者),您会推荐哪条路线?

4

1 回答 1

1

我会说使用足够老的 Boost 版本来兼容所有你希望它兼容的发行版。

于 2012-02-02T02:32:50.547 回答