在ios上使用框架中的boost::filesysystem路径

在ios上使用框架中的boost::filesysystem路径,ios,boost,Ios,Boost,很长一段时间以来,我一直在使用Boost作为从Pete Goodliffe的脚本构建的框架。效果很好。最近,我遇到了一个问题,通过将以下代码放到一个全新的XCode项目中的视图控制器的viewDidLoad中,可以重现这个问题: #include "boost/filesystem/path.hpp" #include "boost/filesystem/operations.hpp" - (void)viewDidLoad { [super viewDidLoad]; bo

很长一段时间以来,我一直在使用Boost作为从Pete Goodliffe的脚本构建的框架。效果很好。最近,我遇到了一个问题,通过将以下代码放到一个全新的XCode项目中的视图控制器的viewDidLoad中,可以重现这个问题:

#include "boost/filesystem/path.hpp"
#include "boost/filesystem/operations.hpp"


- (void)viewDidLoad
{
    [super viewDidLoad];
    boost::filesystem::path path("/var/mobile/Applications/.../Documents/somefile.txt");
    bool b = boost::filesystem::exists(path);
}

当路径对象被销毁时,这将导致EXC_BAD_访问(问题发生在path的基本_字符串成员的析构函数中)。还有其他人遇到过这个问题吗?所有内容都是使用相同的SDK构建的,并且在测试项目和框架上的可见性设置是相同的。在Inside::exists中,在path上调用的唯一函数是.c_str(),我可以在代码中毫无问题地调用它。它将.c_str()的结果传递给::stat,我也可以成功调用它。这似乎是某种运行时不匹配。有什么想法吗?

Pete Goodliffe的脚本使用gcc构建boost,当前SDK中的gcc是llvm gcc。Build系统检测gcc并为某些事情启用一组可见性宏,特别是在使用gcc时文件系统库使用的一些异常宏。默认情况下,使用当前SDK构建的iOS应用程序将使用clang。boost配置头在使用时也会检测到叮当声,并且这些可见性宏的配置方式不同。当您使用clang针对boost构建应用程序,但使用使用gcc构建的boost库时,这会导致一些链接器警告,例如关于所讨论的异常类的vtable和析构函数可见性。当字符串被传递到其中一个类中时(调用filesystem::exists()时可能会发生这种情况),您会看到析构函数中出现崩溃

对于这个特定的示例,您可以通过使用visibility=default构建boost来解决这个问题,但是对于非平凡的应用程序,这不太可能很好地工作。到目前为止,最好的选择似乎是将编译器设置为clang++,这样在构建库时,这些类的可见性设置与构建应用程序时的可见性设置相同。下面是我当前使用的user-config.jam(我的修改版本)脚本和Xcode 4.2.x。请注意,如果您没有在脚本中设置$IPHONE_SDKVERSION、ARM_DEV_DIR和SIM_DEV_DIR,则需要替换它们。对我来说,它们分别是iphone和simulator SDK的5.0和bin目录:

using darwin : $IPHONE_SDKVERSION~iphone
   : ${ARM_DEV_DIR}clang++
   : <striper>
   <compileflags>"-arch armv7 -fvisibility=hidden -fvisibility-inlines-hidden $EXTRA_CPPFLAGS"
   : <architecture>arm <target-os>iphone
   ;
using darwin : $IPHONE_SDKVERSION~iphonesim
   : ${SIM_DEV_DIR}clang++
   : <striper>
   <compileflags>"-arch i386 -fvisibility=hidden -fvisibility-inlines-hidden $EXTRA_CPPFLAGS"
   : <architecture>x86 <target-os>iphone
   ;
使用达尔文:$IPHONE\u SDKVERSION~IPHONE
:${ARM_DEV_DIR}clang++
: 
“-arch-armv7-fvisibility=hidden-fvisibility内联线hidden$EXTRA\u CPPFLAGS”
:arm iphone
;
使用达尔文:$IPHONE\u SDKVERSION~iphonesim
:${SIM_DEV_DIR}clang++
: 
“-arch i386-fvisibility=hidden-fvisibility inlines hidden$EXTRA_CPPFLAGS”
:x86 iphone
;
到目前为止,这似乎运作良好;我还没有进行足够的测试来完全保证boost不会出现与叮当声相关的问题,但这看起来比将新的iPhone项目带回llvm gcc要容易得多