ios

2012-02-01 23 views
7

çerçevesinden boost :: filesysystem yolunu kullanarak, Boost'u Pete Goodliffe'nin komut dosyasından uzun bir süredir oluşturulmuş bir çerçeve olarak kullanıyorum. Harika çalışıyor.ios

yol nesne yok olduğunda bu EXC_BAD_ACCESS sonuçlanır
#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); 
} 

(sorun: Son zamanlarda bir başka yepyeni XCode projesinde bir görünüm denetleyicisinin viewDidLoad aşağıdaki kodu bırakarak yeniden olabilir bir sorun isabet yolun basic_string üyesinin yıkıcısında meydana gelir). Bu probleme giren başka biri var mı? Her şey aynı SDK ile oluşturulmuştur ve görünürlük ayarları test projesinde ve çerçevede aynıdır. İçinde :: var, yol üzerinde çağrılan tek işlev kodumda hiçbir sorun olmadan arayabileceğim .c_str() 'dir. Başarılı bir şekilde de çağırabildiğim .c_str() sonucunu :: stat'e iletir. Bir tür çalışma zamanı uyuşmazlığı gibi görünüyor. Herhangi bir fikir?

cevap

7

Pete Goodliffe'nin betiği, mevcut SDK'sında llvm-gcc olan gcc kullanarak destek oluşturur. Boost.Build sistemi, gcc'yi algılar ve GCC kullanımdayken dosya sistemi kütüphanesi tarafından kullanılan istisnai makroların bazıları için belirli şeyler için bir dizi görünürlük makroları sağlar. Varsayılan olarak, geçerli SDK kullanılarak oluşturulan iOS uygulamaları clang kullanacaktır. Yükseltme yapılandırma üstbilgileri, kullanımdayken de clang'i algılar ve bu görünürlük makroları aynı şekilde yapılandırılmaz. Bu, uygulamanızı artırmaya karşı oluşturmak için clang kullandığınızda, ancak gcc ile oluşturulan bir destek kitaplığı kullandığınızda bazı bağlayıcı uyarılarına yol açar, örn. İstisna sınıfları için vtable ve destructor görünürlük hakkında. Dize, bu sınıflardan birine geçtiğinde, dosya sistemi :: exists() öğesini çağırdığınızda gerçekleşmesi muhtemel olan, yıkıcıda bir kilitlenme görürsünüz.

Bu özel örnek için, sorun giderme ile görünürlüğü artırarak sorunu giderebilirsiniz = varsayılan, ancak bu önemsiz olmayan uygulamalar için iyi çalışma olasılığı yoktur. Şimdiye kadar, en iyi bahis, derleyiciyi clang ++ 'a ayarlamaktır. Böylece, uygulamayı oluştururken yaptığınız gibi kütüphaneyi oluştururken aynı görünürlük ayarlarına sahip olursunuz. Şu anda kullanıyorum user-config.jam o komut dosyası ve Xcode 4.2.x ile (benim değiştirilmiş sürümü) kullanıyorum. Bunları komut dosyanızda ayarlamıyorsanız, $ IPHONE_SDKVERSION, ARM_DEV_DIR ve SIM_DEV_DIR değerini değiştirmeniz gerektiğini unutmayın. Benim için onlar sırasıyla iphone ve simülatör SDK'larından 5.0 ve bin dizinleri, konum: Şimdiye kadar

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 
    ; 

, iyi çalışıyor gibi görünüyor; Kendimi tamamen artırma konusunda yeterince test edemedim, destekle ilgili herhangi bir sorun yaşanmadı, ancak bu yeni iPhone projelerini tekrar llvm-gcc'ye götürmekten daha kolay görünüyor.