2015-11-12 29 views
4

我有一个嵌入式系统,并希望在这个系统中使用boost,但需要禁用异常,因为我不想支付异常的代价。为什么boost :: shared_ptr无法编译,如果BOOST_NO_EXCEPTIONS定义在user.hpp

升压给一个user.hpp和可设置的微距拍摄选项BOOST_NO_EXCEPTIONSBOOST_NO_EXCEPTION_STD_NAMESPACE,但的boost :: shared_ptr的不能编译(更准确地说,无法链接),如果这两个宏定义。

shared_ptr_boost.cpp:(.text._ZN5boost6detail12shared_countC2IiEEPT_[_ZN5boost6detail12shared_countC5IiEEPT_]+0x7a): undefined reference to `boost::throw_exception(std::exception const&)' 
collect2: error: ld returned 1 exit status 

为什么boost会给宏选项,但不承诺用这些选项编译?

回答

9

它可以编译。

它只是不能链接。

这是因为如果你定义BOOST_NO_EXCEPTIONS,你必须在某处提供boost::throw_exception(std::exception const&)的实现,以取代通常的错误提升设施。

必须通过评论读取中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 
+0

如果由用户定义,在BOOST_NO_EXCEPTIONS被定义的情况下,这个函数是否有意义?谁会叫它? –

+0

如果库需要失败,库会调用它。在未处理的特殊情况下......我猜是否合理取决于你留下的未处理错误以及如何实现它。 – sehe

-1

这是我的最终解决方案。

shared_ptr_boost.cpp:

#include <boost/shared_ptr.hpp> 
#include <stdio.h> 
#include <exception> 

namespace boost{ 
    void throw_exception(std::exception const &e){} 
} 
int main(){ 
    boost::shared_ptr<int> pName(new int(2)); 
    *pName += 3; 
    printf("name = %d\n", *pName); 
    return 0; 
} 

编译命令:

arm-hisiv100-linux-uclibcgnueabi-g++ -I../boost_1_59_0/ -DBOOST_NO_EXCEPTIONS -DBOOST_NO_EXCEPTION_STD_NAMESPACE -fno-exceptions shared_ptr_boost.cpp

对于这样一个小的测试程序,我得到约1.7K较小的可执行文件;这就是我不想为异常支付的费用。

+0

“这样一个小程序”的大小差异是无关紧要的。我的90MiB二进制文件可能还有1.7k。另外,你做了什么?只是忽略例外?我不想使用该软件。 – sehe

相关问题