这与其说是一个问题,不如说是一个答案,因为我已经弄清楚了,至少在干净利落地编译库方面是这样。对我来说,主要的问题是让shared_ptr正常工作。
成分:
Boost版本1.45.0
http://www.anddev.org/viewtopic.php?p=29939上的STLport版本。
NDK的r4b版本。
说明:
在您的Android.mk文件中添加:
LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC
在stlport/stl/_ __stl_throw_length_error .h的第613行删除对字符串的调用。如果你愿意,你可以使用_STLP_NO_EXCEPTIONS。
编辑第261行之后的boost/boost/smart_ptr/shared_ptr.hpp,以消除shared_ptr构造函数中对boost::throw_exception的调用。我在整个方法体周围使用了#ifndef BOOST_EXCEPTION_DISABLE。(但请参阅下面的答案。)
接下来,您需要补充一些缺失的部分。创建一个包含以下内容的头文件:
#ifdef OS_ANDROID
#include <exception>
namespace std
{
struct bad_alloc : public exception { bad_alloc operator()(){}};
}
#endif
以及一个包含支持bad_alloc的精简异常类的源文件:
#ifdef OS_ANDROID
#include <exception>
namespace std
{
exception::exception() {}
exception::~exception() {}
const char* exception::what() const {}
}
#endif
在您要包含boost/shared_ptr.hpp的任何位置都包含头文件。编译源代码并将其添加到库中。
发布于 2010-12-07 00:41:17
事实证明,在编译可调试库时,这种方法并不完全有效。发行库是用-O2编译的,这优化了一些不足之处,但是调试库是用-O0编译的,这暴露了一些额外的问题。此外,我对不得不编辑boost文件并不是很满意。因此,通过一些额外的研究,我提出了以下解决方案。
首先,不要编辑任何boost文件。而是将以下内容添加到std命名空间内的标头中:
struct bad_cast : public exception {bad_cast operator()(){}};
接下来,将以下内容添加到源文件中:
namespace boost
{
void throw_exception(std::exception const&) {}
}
现在,即使AndroidManifest.xml中的android:debuggable=为“true”,它也会编译并链接到应用程序中。它不会在模拟器中运行,但在我包含这个库之前,它也不会运行。
发布于 2010-12-09 03:47:42
值得注意的是,NDK附带了STLport和GNU STL,所以既然NDK C++编译器中有a) r5支持b)异常支持,那么这里的hack就不再是必要的了。
发布于 2011-02-14 20:46:35
特别是shared_ptr的另一种解决方法是改用boost::intrusive_ptr。这并不总是可行的,但对我的情况有效。
https://stackoverflow.com/questions/4347151
复制相似问题