2012-02-02 13 views
1

私はsingle.soファイルとしてユーザーに配布したいC++ライブラリをビルドしていましたが、ほとんどの場合、.soファイルはディストリビューションには依存しません。したがって、私はサードパーティ製のライブラリを静的にリンクしています(しかし、まだ動的に標準ライブラリにリンクしています)C++ STLバージョニングの問題+ Boost

今は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ビットシステム上の巨大な苦痛であるのlibstdC++に対してほとんど64ビットシステムに含まれています。 -fPICで構築されたものではなく、-fPIC is actually a necessity to do static linking on 64 bit systemsです。実際にlibstdC++をビルドしなければならないでしょう...
  • 互換性のあるバージョンにboost :: timerを元に戻します。しかし、これは独自の問題を伴います:ブーストウェブサイト上のどこで標準ライブラリ(そしてどのバージョン)への依存関係を文書化していますか?私は情報を見つけることができないようだが、これは賢明な選択ですか?スタンダード図書館が私のために持っている驚きはありますか?

私の目標(できるだけディストリビューションに近い)を考えれば、どのルートをお勧めしますか?

+3

"*ブーストウェブサイトでは、スタンダードライブラリ(およびどのバージョン)に依存関係を文書化していますか?それらはすべてドキュメント化されていますか?*"標準ライブラリは標準化されています - なぜ必要なのですか? APIは壊れた方法で変更されておらず、ABIだけが持っており、それはどのライブラリのコントロールの外にもあります。 – ildjarn

+0

@ildjarnおそらく、ABIの変更はライブラリのインタフェースの変更ではなく、私の問題です。どちらの方法でも、問題を修正するために必要な変更はないと思っていますが、標準ライブラリであっても、何らかのバージョン管理スキームが使用されることが予想されます。 C++ 0xなどの標準を除いてバージョンはありませんか?この場合、ABIはCentOS 5.3と6.2の唯一の違いを変更していますか? – Ben

+3

異なる標準ライブラリバージョン間でさまざまなAPI変更が存在する可能性がありますが、_breaking_変更はありません。確かに、ABIの変更はあなたの問題です。特に、オンラインで検索する何かを持っていると言いました。私はこの問題を回避する方法を知らないので、\ * nix上のほとんどのプログラムはオープンソースなので、ユーザーのシステム上にある標準ライブラリにビルドしてリンクすることができます。 – ildjarn

答えて

1

互換性を持たせたいすべてのディストリビューションと互換性があるほど古いバージョンのBoostを使うといいでしょう。

+0

それは私が行ったルートです。 libstdC++をビルドするということは、gcc/g ++をビルドすることです。これは心臓部のためのものではありません。 – Ben

関連する問題