【问题标题】:boost filesystem::path constructor std::length_errorboost filesystem::path 构造函数 std::length_error
【发布时间】:2012-01-23 02:04:04
【问题描述】:

我正在尝试使用 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。

提前谢谢你, 卢卡

编辑

这是执行的 boost 代码(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()

正确执行

【问题讨论】:

  • 这是您正在运行的确切代码吗?
  • 尝试在调试器中运行并告诉我们错误的确切来源(文件/行)。
  • 是的,这是确切的代码。我用抛出的那一行更新了帖子。感谢您的帮助
  • 您是否使用自动链接来选择要链接的正确 boost 库?如果您使用 CRT 静态库而 boost 在 DLL 中使用 CRT,则可能会出现此类问题,反之亦然。
  • 我没有使用自动链接,我手动指定了我需要链接的所有库。这是我第一次使用 vc++,我以前只在 Linux 上使用 gnu 工具在 C++ 中编程,实际上我不知道 windows CRT 以及如果我静态链接它如何检查它。我会尽快检查出来。

标签: c++ boost boost-filesystem


【解决方案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 链接)。

【讨论】:

  • 我手动编译并使用了自动链接。现在可以了,谢谢。顺便说一句,我第一篇文章中的代码行只是为了举例说明;显然我正在使用你建议的 boost 命名空间。
  • @Picci 抱歉,我一直在给大家上风格课,哈哈。我想这在这里有点相关。我很高兴你让它工作。我正在多个平台和架构上进行部署,因此知道这是 CRT 问题实际上对我很有帮助。现在我知道如果我没有让我的二进制文件在 GCC 的主要版本中保持最新,我应该在哪里寻找类似的错误。
【解决方案2】:

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

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

boost_filesystem:库的基本名称

vc100:Visual Studio 版本(vc100 for VS2010)

mt:多线程

gd:调试版本

1_49:版本

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 2018-02-18
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多