2012-02-14 8 views
6

私は古いバージョンのOpenOfficeをコンパイル/移植しようとしています。これは、ソースツリーの一部であるBoost v1.34.1を使用します。エラーメッセージは次のとおりです。ブーストシンボルが見つかりません

Undefined symbols: 
    "boost::throw_exception(std::exception const&)", referenced from: 
     boost::detail::shared_count::shared_count<ScToken>(ScToken*)in detfunc.o 
ld: symbol(s) not found 

ブーストは私には新しく、これを理解するのに役立つ多くのオンラインを見つけることができませんでした。エラーメッセージから、私はおそらくライブラリをリンクする必要があることを理解しています。しかし、boost::throw_exceptionはヘッダファイルに定義されています(私が見つけることができる)。ちょうどキックのために、私は#include <boost/throw_exception.hpp>をdetfuncで試し、シンボリックリンクを使ってヘッダファイルを同じディレクトリに置いてください。

ライブラリは-lまたはインクルードパス-Iでリンクする必要がありますか?そのシンボルはどのようにして取得するのですか?

答えて

12

Boostは、プロジェクトがマクロBOOST_NO_EXCEPTIONSで定義されていないか、またはboost::throw_exceptionという関数を定義することを期待しています。バージョン1.34.1で<boost/throw_exception.hpp>から

namespace boost 
{ 

#ifdef BOOST_NO_EXCEPTIONS 

void throw_exception(std::exception const & e); // user defined 

#else 

//[Not user defined --Dynguss] 
template<class E> inline void throw_exception(E const & e) 
{ 
    throw e; 
} 

#endif 

} // namespace boost 

ブーストの設定ヘッダはマクロかどうかを定義するかどうかを判断します。それはあなたが使用しているコンパイラにまで沸騰するようですが、他の要因があるかもしれません。 boost/config/compiler/フォルダ内で、コンパイラに対応するヘッダーファイルを探し、BOOST_NO_EXCEPTIONSを探します。 Boostがいつ定義するのかを説明するために、#defineの周りにいくつかの条件があるはずです。定義を回避し、発生しているリンカエラーを回避するようにビルドを構成することができます。

コンパイラの設定を変更して定義を回避できない場合は、おそらくboost::throw_exception(std::exception const & e)をOpenOfficeコードのどこかに定義したままになります。私はそのコードには慣れていないので、どこに行くべきか良い提案はできません。

+0

ありがとうございます!私は最終的に 'throw_exception.hpp'を読んで、あなたが答えたものを正確に発見しました。私は、コンパイラフラグの 'boost/config/compiler /'について認識していませんでしたが、確かに 'BOOST_NO_EXCEPTIONS'が定義されていました。 – Jerry

関連する問題