2011-12-18 41 views
5

tôi đang cố gắng lặp qua thư mục bằng cách sử dụng thư viện Boost.Filesystem.tăng hệ thống tập tin :: đường dẫn constructor std :: length_error

Vấn đề là khi tôi cố gắng khởi tạo đối tượng đường dẫn, tôi nhận được tiêu chuẩn :: length_error với thông báo "chuỗi quá dài" với các chuỗi có độ dài bất kỳ, ngay cả ví dụ "pippo".

Tôi đã thử tất cả các:

string s = "pippo"; 

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

Tôi đang trên windows 7 với tăng biên dịch sẵn phiên bản 1.47 cho vC++ 10.

Cảm ơn bạn trước, Luca

EDIT

này được mã tăng thực hiện (path.hpp dòng 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()); 
} 

và lỗi được ném từ (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); 
} 

chức năng ném là "chuyển đổi". Từ debugger tôi thấy rằng cả hai

&*c.begin() 

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

được thực hiện một cách chính xác

+0

Đây có phải là mã chính xác mà bạn đang chạy không? – CharlesB

+1

Hãy thử chạy trong trình gỡ lỗi và cho chúng tôi biết chính xác lỗi xuất phát từ đâu (tệp/dòng). –

+0

Có đây là mã chính xác. Tôi đã cập nhật bài đăng với dòng mà ném. Cảm ơn bạn đã trợ giúp –

Trả lời

1

Bạn nói rằng Boost được tiền biên dịch cho VC++ 10, nhưng bạn không nói mà trình biên dịch bạn đang sử dụng. Nếu bạn đang sử dụng Visual C++ Express, bạn cần phải tự biên dịch nó.

Nhưng, vì tôi sắp sử dụng boost :: filesystem, tôi nghĩ mình sẽ điều tra để tìm hiểu một chút.

Thứ nhất, bạn hầu như không bao giờ được đặt toàn bộ không gian tên Boost vào vùng tên đồng bằng của mình bất cứ khi nào có thể (đặc biệt nếu bạn đang làm như vậy với std!). Đăng mã như thế này làm cho nó trông giống như bạn đang "sử dụng không gian tên" quá nhiều. Nếu bạn không muốn gõ boost :: hệ thống tập tin ở khắp mọi nơi, làm được điều này:

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

hoặc

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

Bao gồm không gian tên Boost trong không gian tên địa phương của bạn như bạn dường như có thể có những hậu quả thảm hại (hoặc nơi làm việc tốt, đó là may mắn của trận hòa). Khi bạn nhận thấy, các cuộc gọi chức năng giết chết nó là chuyển đổi() - có lẽ có một chuyển đổi() một nơi nào đó mà là thay thế nó?

Tiếp theo, bạn nên bật liên kết tự động (cho thư viện này). Tài liệu Boost chính thức cho biết sử dụng liên kết tự động. Những người tăng cường rất thông minh (có lẽ quá thông minh - làm việc với các thư viện thời gian là một nỗi đau ...) Nó hoạt động tốt cho Visual Studio 2010.

Nếu điều đó không khắc phục được, thì trình biên dịch sẵn có của bạn đang sử dụng CRT (vì hàm chuyển đổi xuất hiện trong thư viện Boost). Điều này có thể xảy ra vì nhiều lý do, ví dụ, gói dịch vụ VS2k10 có thể được cài đặt trên nguồn của bạn/không phải trên máy của bạn, v.v.

Giải pháp cuối cùng là tự biên dịch Boost. Nó rất, rất dễ dàng trên Windows: tải về các nguồn Boost, và giải nén vào bất kỳ thư mục nào. Sau đó, mở một dấu nhắc lệnh (bắt đầu-> chạy cmd.exe) và làm:

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

Sau đó, chỉ cần đợi khoảng 45 phút trên Core 2 Duo 2.5GHz. Nó sẽ tạo ra các thư viện Boost với CRT chính xác. Nếu bạn vẫn còn có vấn đề sau đó, sau đó có cái gì đó sâu hơn sai với hệ thống xây dựng của bạn, chẳng hạn như liên kết với một thư viện tăng tĩnh trong khi sử dụng DLL CRT (bạn nên liên kết DLL Boost với DLL CRT).

+0

Tôi đã biên soạn thủ công và sử dụng autolinking. Bây giờ nó hoạt động, cảm ơn bạn. Nhân tiện, các dòng mã trong bài viết đầu tiên của tôi chỉ là minh họa; obviusly tôi đang sử dụng không gian tên tăng như bạn đề nghị. –

+0

@Picci xin lỗi, tôi tiếp tục cho mọi người bài học theo phong cách, haha. Tôi đoán đó là loại có liên quan ở đây. Tôi rất vui vì bạn đã làm việc. Tôi đang triển khai trên nhiều nền tảng và kiến ​​trúc nên thật sự hữu ích khi tôi biết rằng đó là vấn đề CRT. Bây giờ tôi biết nơi để tìm các lỗi tương tự nếu tôi không giữ các tập tin nhị phân của tôi đến nay trên, nói rằng, phiên bản chính của GCC. –

1

Có thể tìm thấy lỗi có thể xảy ra trên thư viện bạn đã liên kết trong dự án (bản phát hành thay vì bản gỡ lỗi). Ví dụ.

Giả sử bạn đang sử dụng Visual Studio 2010 với cấu hình "Gỡ lỗi" đang hoạt động. Bạn phải liên kết boost_filesystem-vc100-mt-gd-1_49.dll

boost_filesystem: basename của thư viện

vc100: phiên bản Visual Studio (vc100 cho VS2010)

mt : đa luồng

gd: phiên bản gỡ lỗi

1_49: phiên bản

Có thể bạn đã liên kết thư viện mà không có "gd".

Các vấn đề liên quan