5

Boost.Filesystemライブラリを使用してディレクトリを反復処理しようとしています。

問題は、パスオブジェクトをインスタンス化しようとすると、「pippo」などの任意の長さの文字列で「stringotolong」というメッセージが表示されたstd::length_errorが発生することです。

私はすでにこれらすべてを試しました:

string s = "pippo";

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

私は、vc++10用のブーストプリコンパイル済みバージョン1.47を搭載したWindows7を使用しています。

よろしくお願いします、ルカ

編集

これは実行されたブーストコードです(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());
}

エラーは(path_traits.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);
}

スローする関数は「変換」です。デバッガーから私は両方を見ました

&*c.begin()  

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

正しく実行されます

4

2 に答える 2

1

BoostはVC++10用にプリコンパイルされているとおっしゃいましたが、どのコンパイラを使用しているのかはわかりませんでした。Visual C ++ Expressを使用している場合は、自分でコンパイルする必要があります。

しかし、boost :: filesystemを使用しようとしているので、少し自分で学ぶために調査したいと思いました。

まず、Boost名前空間全体を可能な限りプレーン名前空間に配置することはほとんどありません(特にstdを使用している場合)。このようなコードを投稿すると、「名前空間を使用しすぎている」ように見えます。どこでもboost::filesystemと入力したくない場合は、次のようにします。

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

また

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

あなたのようにローカル名前空間にBoost名前空間を含めると、悲惨な結果を招く可能性があります(または、うまく機能します。それは引き分けの運です)。お気づきのように、それを強制終了する関数呼び出しはconvert()です-おそらくどこかにそれを置き換える別のconvert()がありますか?

次に、(このライブラリの)自動リンクを有効にする必要があります。Boostの公式ドキュメントには、自動リンクを使用するように記載されています。Boostの人々は非常に賢いです(おそらくあまりにも賢いです-タイムライブラリを操作するのは苦痛です...)それはVisualStudio2010でうまく機能します。

それでも問題が解決しない場合は、プリコンパイルされたBoostが別のCRTを使用しています(変換関数がBoostライブラリにあるように見えるため)。これは多くの理由で発生する可能性があります。たとえば、VS2k10サービスパックがソースにインストールされている/ソースにインストールされていないなどです。

究極の解決策は、Boostを自分でコンパイルすることです。Windowsでは非常に簡単です。Boostソースをダウンロードして、任意のディレクトリに抽出します。次に、コマンドプロンプトを開き(start-> run cmd.exe)、次の手順を実行します。

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

次に、Core 2Duo2.5GHzで約45分待ちます。正しいCRTでBoostライブラリを生成します。それでも問題が解決しない場合は、DLL CRTの使用中に静的Boostライブラリにリンクするなど、ビルドシステムにさらに深刻な問題があります(DLLBoostをDLLCRTにリンクする必要があります)。

于 2011-12-23T13:50:38.863 に答える
1

プロジェクトでリンクしたライブラリでエラーが発生する可能性があります(デバッグライブラリではなくリリース)。例えば。

「デバッグ」構成がアクティブな状態でVisualStudio2010を使用しているとします。boost_filesystem-vc100-mt-gd-1_49.dllをリンクする必要があります

boost_filesystem:ライブラリのベース名

vc100:Visual Studioバージョン(VS2010の場合はvc100)

mt:マルチスレッド

gd:デバッグバージョン

1_49:バージョン

「gd」なしでライブラリをリンクした可能性があります。

于 2015-10-21T15:45:37.170 に答える