我有一个嵌入式系统,并希望在此系统中使用boost,但需要禁用异常,因为我不想支付异常费用。
Boost已经给出了一个user.hpp和可设置的宏选项 BOOST_NO_EXCEPTIONS 和 BOOST_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会提供宏选项,但不承诺使用这些选项进行编译?
答案 0 :(得分: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
答案 1 :(得分:-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的可执行文件;那是我不想为异常付出的代价。