2012-02-14 95 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本身。

<boost/throw_exception.hpp>在1.34.1版本:

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的配置頭將決定是否定義宏與否。它看起來像歸結爲你正在使用的編譯器,但可能還有其他因素。查看boost/config/compiler/文件夾中對應於您的編譯器的頭文件,然後在其中搜索BOOST_NO_EXCEPTIONS。在#define周圍應該有一些條件來幫助解釋何時由Boost定義它。您可能能夠配置您的構建以避免定義,並克服您遇到的鏈接器錯誤。

如果您無法更改編譯器配置以避免定義,那麼您可能會自己在OpenOffice代碼中的某處定義boost::throw_exception(std::exception const & e)。不過,我對這些代碼並不熟悉,所以我無法給出一個好的建議。

+0

謝謝!我最終閱讀了'throw_exception.hpp',並已經發現了你的答案。我沒有意識到編譯器標誌的'boost/config/compiler /',但是果然,'BOOST_NO_EXCEPTIONS'被定義了。 – Jerry 2012-03-03 11:16:32