我正在尝试编译/移植旧版本的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对我来说是新的,我无法在网上找到太多帮助我理解这一点。从错误消息中,我了解到我可能需要链接库。但是,boost::throw_exception
在头文件中定义,没有匹配的库(我可以找到)。只是为了踢,我在detfunc中尝试#include <boost/throw_exception.hpp>
并使用符号链接将头文件放在同一目录中而没有运气。
我应该使用-l
或-I
的包含路径链接库吗?我应该如何在?
答案 0 :(得分:13)
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的配置标头将决定是否定义宏。看起来它归结为您正在使用的编译器,但可能还有其他因素。查看boost/config/compiler/
文件夹中与您的编译器对应的头文件,然后在其中搜索BOOST_NO_EXCEPTIONS
。 #define
周围应该有一些条件来帮助解释Boost何时定义它。您可以配置构建以避免定义并通过您遇到的链接器错误。
如果您无法更改编译器配置以避免定义,那么您可能会在OpenOffice代码中的某处自己定义boost::throw_exception(std::exception const & e)
。不过我对这段代码并不熟悉,所以我无法给出一个好的建议。