2011-12-18 17 views
5

sto provando ad eseguire iterazioni su una directory utilizzando la libreria Boost.Filesystem.boost filesystem :: percorso costruttore std :: length_error

Il problema è che quando provo a istanziare un oggetto percorso, ottengo uno std :: length_error con il messaggio "stringa troppo lunga" con stringhe di qualsiasi lunghezza, anche per esempio "pippo".

Ho già provato tutti questi:

string s = "pippo"; 

path p(s); 
path p(s.begin(), s.end()); 
path p(s.c_str()); 
path p("pippo"); 

Sono in Windows 7 con spinta precompilata versione 1.47 per VC++ 10.

Grazie in anticipo, Luca

EDIT

questo è il codice eseguito spinta (linea path.hpp 129)

template <class Source> 
path(Source const& source, 
    typename boost::enable_if<path_traits::is_pathable< 
    typename boost::decay<Source>::type> >::type* =0) 
{ 
    path_traits::dispatch(source, m_pathname, codecvt()); 
} 

e l'errore viene generato da (path_traits .hpp line 174)

template <class U> inline 
void dispatch(const std::string& c, U& to, const codecvt_type& cvt) 
{ 
    if (c.size()) 
    convert(&*c.begin(), &*c.begin() + c.size(), to, cvt); 
} 

la funzione che lancia è "convert". Dal debugger ho visto che entrambi

&*c.begin() 

e

&*c.begin() + c.size() 

vengono eseguiti correttamente

+0

È questo il codice esatto che stai utilizzando? – CharlesB

+1

Provare a eseguire in un debugger e dirci esattamente da dove proviene l'errore (file/riga). –

+0

Sì, questo è il codice esatto. Ho aggiornato il post con la linea che lancia. Grazie per l'aiuto –

risposta

1

Lei ha detto che Boost è pre-compilato per VC++ 10, ma non ti ho detto che compilatore che stai usando. Se stai usando Visual C++ Express devi compilarlo da solo.

Ma, dato che sto per usare boost :: filesystem, ho pensato di indagare per imparare un po 'da solo.

In primo luogo, non dovresti quasi mai mettere un intero spazio dei nomi Boost nel tuo spazio dei nomi semplice, ove possibile (specialmente se lo fai con std!). Pubblicare un codice come questo fa sembrare che stai "usando lo spazio dei nomi" troppo. Se non si desidera digitare boost :: filesystem ovunque, fare questo:

namespace fs = boost::filesystem; 
fs::path p(whatever); 

o

using boost::filesystem::path; 
using std::string; 
string foo("Hello!"); 
path p(foo); 

Compresi i namespace spinta nel vostro spazio dei nomi locale, come ti sembra di può avere conseguenze disastrose (o lavoro bene, è la fortuna del sorteggio). Come hai notato, la chiamata alla funzione che lo uccide è convert() - c'è forse un altro convert() da qualche parte che lo sta sostituendo?

Successivamente, è necessario abilitare il collegamento automatico (per questa libreria). La documentazione ufficiale di Boost dice di usare il collegamento automatico. Le persone Boost sono molto intelligenti (forse troppo intelligenti - lavorare con le librerie del tempo è un dolore ...) Funziona bene per Visual Studio 2010.

Se ciò non risolve il problema, il tuo Boost precompilato utilizza un diverso CRT (poiché la funzione di conversione sembra essere nella libreria Boost). Questo può accadere per molte ragioni, ad esempio, il service pack VS2k10 può essere installato sulla tua sorgente/non sul tuo, ecc.

L'ultima soluzione è compilare Boost. È molto, molto semplice su Windows: scarica i sorgenti di Boost ed estrai in qualsiasi directory. Quindi aprire un prompt dei comandi (Start-> Esegui cmd.exe) e fare:

cd\ 
cd "boost root directory" 
boostrap 
.\b2 

Poi basta aspettare circa 45 minuti su un Core 2 Duo 2.5GHz. Genera le librerie Boost con il CRT corretto. Se hai ancora problemi allora, c'è qualcosa di più sbagliato nel tuo sistema di compilazione, come il collegamento a una libreria Boost statica durante l'utilizzo di DLL CRT (devi collegare DLL Boost con DLL CRT).

+0

Ho compilato manualmente e utilizzato l'autolinking. Ora funziona, grazie. A proposito, le righe di codice nel mio primo post sono solo per esemplificare; Ovviamente sto usando lo spazio dei nomi di boost come suggerito. –

+0

@Picci scusa, continuo a dare lezioni di stile a tutti, haha. Immagino che fosse qualcosa di rilevante qui. Sono contento che tu abbia funzionato. Sto implementando su piattaforme e architetture multiple, quindi è utile per me sapere che si tratta di un problema CRT. Ora so dove cercare errori simili se non sto mantenendo aggiornati i miei binari attraverso, ad esempio, le versioni principali di GCC. –

1

Un possibile errore può essere trovato nella libreria collegata nel progetto (versione invece di una di debug). Ad esempio.

Supponiamo di utilizzare Visual Studio 2010 con la configurazione "Debug" attiva. Bisogna collegare boost_filesystem-VC100-mt-gd-1_49.dll

boost_filesystem: nome base di biblioteca

VC100: versione di Visual Studio (VC100 per VS2010)

mt : multithreading

gd: eseguire il debug versione

1_49: versione

Forse hai collegato la libreria senza il "gd".

Problemi correlati