5

我正在尝试使用 Boost.Filesystem 库遍历目录。

问题是当我尝试实例化一个路径对象时,我得到一个 std::length_error 消息“字符串太长”,其中包含任何长度的字符串,甚至例如“pippo”。

我已经尝试了所有这些:

string s = "pippo";

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

我在 Windows 7 上使用 vc++10 的 boost 预编译版本 1.47。

提前谢谢你,卢卡

编辑

这是执行的升压代码(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 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);
}

抛出的函数是“转换”。从调试器我看到两者

&*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 的人非常聪明(也许太聪明了——使用时间库很痛苦……)它适用于 Visual Studio 2010。

如果这不能解决问题,则您的预编译 Boost 正在使用不同的 CRT(因为 convert 函数似乎在 Boost 库中)。发生这种情况的原因有很多,例如,VS2k10 服务包可能安装在您的源/而不是您的源上,等等。

最终的解决方案是自己编译Boost。在 Windows 上非常非常简单:下载 Boost 源,然后解压到任何目录。然后打开命令提示符(开始->运行 cmd.exe)并执行:

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

然后在 Core 2 Duo 2.5GHz 上等待大约 45 分钟。它将使用正确的 CRT 生成 Boost 库。如果您仍然有问题,那么您的构建系统存在更深层次的问题,例如在使用 DLL CRT 时链接静态 Boost 库(您应该将 DLL Boost 与 DLL CRT 链接)。

于 2011-12-23T13:50:38.863 回答
1

在您在项目中链接的库(发布而不是调试库)中可以找到可能的错误。例如。

假设您正在使用“调试”配置处于活动状态的 Visual Studio 2010。您必须链接 boost_filesystem-vc100-mt-gd-1_49.dll

boost_filesystem : 库的基本名称

vc100 : Visual Studio 版本 (vc100 for VS2010)

mt:多线程

gd : 调试版本

1_49 : 版本

也许您已经链接了没有“gd”的库。

于 2015-10-21T15:45:37.170 回答