2011-12-18 13 views
5

Próbuję iterować nad katalogiem przy użyciu biblioteki Boost.Filesystem.boost filesystem :: konstruktor ścieżek std :: length_error

Problem polega na tym, że gdy próbuję utworzyć instancję obiektu ścieżki, otrzymuję std :: length_error z komunikatem "string too long" z ciągami o dowolnej długości, nawet na przykład "pippo".

Próbowałem już wszystkich z nich:

string s = "pippo"; 

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

Jestem na Windows 7 z doładowania prekompilowana wersji 1.47 dla VC++ 10.

Dziękuję z góry, Luca

EDIT

ten jest wykonywany kod doładowania (linia 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()); 
} 

a błąd jest wyrzucany z (path_traits linia .hpp 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); 
} 

Funkcja, która wyrzuca, to "konwertuj". Z debuggera widziałem, że zarówno

&*c.begin() 

i

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

są prawidłowo wykonywane

+0

Czy to jest dokładny kod, który używasz? – CharlesB

+1

Spróbuj uruchomić w debugerze i powiedz nam dokładnie, skąd pochodzi błąd (plik/linia). –

+0

Tak, to jest dokładny kod. Zaktualizowałem post z linią, która rzuca. Dziękujemy za pomoc –

Odpowiedz

1

Wspomniałeś, że doładowania jest wstępnie skompilowane dla VC++ 10, ale nie powiedzieć, który kompilator, którego używasz. Jeśli korzystasz z Visual C++ Express, musisz go sam skompilować.

Ale, ponieważ mam zamiar użyć systemu plików :: :: boost, pomyślałem, że sprawdzę, aby się trochę nauczyć.

Po pierwsze, prawie nigdy nie należy umieszczać całego obszaru nazw Boost w zwykłym obszarze nazw, gdzie to możliwe (zwłaszcza jeśli robisz to ze std!). Umieszczenie kodu w ten sposób sprawia, że ​​wygląda on tak, jakby "zbytnio używać przestrzeni nazw". Jeśli nie chcesz wpisywać boost :: plików wszędzie, to zrobić:

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

lub

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

tym nazw wzrost w lokalnej przestrzeni nazw jak wydaje się, może mieć katastrofalne skutki (lub praca w porządku, to jest losowanie losowania). Jak zauważyłeś, wywołanie funkcji, które go zabija, to convert() - czy jest może inna konwersja() gdzieś, która ją zastępuje?

Następnie należy włączyć automatyczne łączenie (dla tej biblioteki). Oficjalna dokumentacja Boosta mówi o korzystaniu z automatycznego łączenia. Ludzie są bardzo inteligentne Boost (być może zbyt inteligentne - współpracuje z bibliotekami czas jest ból ...) To działa dobrze dla Visual Studio 2010.

Jeśli to nie pomoże, Twój skompilowany przy użyciu doładowania jest inna CRT (ponieważ funkcja konwersji wydaje się być w bibliotece Boost). Może się tak zdarzyć z wielu powodów, na przykład pakiet serwisowy VS2k10 może być zainstalowany na twoim źródle/nie na twoim, itp.

Ostatecznym rozwiązaniem jest skompilowanie programu Boost. Jest bardzo, bardzo łatwy w systemie Windows: pobierz źródła Boost i rozpakuj je do dowolnego katalogu. Następnie otworzyć wiersz poleceń (start-> uruchom cmd.exe) i wykonaj:

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

potem tylko czekać około 45 minut na Core 2 Duo 2,5 GHz. Wygeneruje biblioteki Boost z poprawnym CRT. Jeśli nadal masz problemy, to jest coś głębszego w systemie kompilacji, na przykład łączenie ze statyczną biblioteką Boost podczas korzystania z DLL CRT (powinieneś połączyć DLL Boost z DLL CRT).

+0

Kompilowałem ręcznie i użyłem autolinkingu. Teraz działa, dziękuję. Przy okazji, linie kodu w moim pierwszym poście są tylko przykładem; Obowiązkowo używam przestrzeni nazw boost, tak jak sugerowałeś. –

+0

@Picci przepraszam, wciąż daje wszystkim lekcje stylu, haha. Sądzę, że to było w pewnym sensie istotne. Cieszę się, że to działa. Wdrażam na wielu platformach i architekturach, więc naprawdę mi pomaga wiedzieć, że był to problem z CRT. Teraz wiem, gdzie szukać podobnych błędów, jeśli nie aktualizuję plików binarnych, na przykład, w głównych wersjach GCC. –

1

Możliwy błąd można znaleźć w bibliotece połączonej w projekcie (wydanie zamiast debugowania). Na przykład.

Załóżmy, że używasz Visual Studio 2010 z aktywną konfiguracją "Debugowanie". Trzeba połączyć boost_filesystem-vc100-mt-gd-1_49.dll

boost_filesystem: basename biblioteki

vc100 wersja Visual Studio (vc100 dla VS2010)

mt : wielowątkowość

gd: wersja do debugowania

1_49 wersja

Być może już powiązany z biblioteki bez "gd".