【问题标题】:Boost.Filesystem create_directories mangles directory nameBoost.Filesystem create_directories 破坏目录名称
【发布时间】:2015-06-08 01:16:31
【问题描述】:

我正在尝试使用 Boost.Filesystem 创建一个目录(该目录可以由用户提供,因此它可能是具有嵌套目录的路径;该路径中的所有、部分或没有目录可能存在以启动)。当我运行程序时,会创建一个目录,但这不是我要求的;包含路径的字符串似乎被破坏了。我从来没有两次得到相同的结果,但目录的名称总是以冒号开头。

一个最小的例子:

#include <iostream>
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
int main(int argc, char* argv[]) {
    fs::path path = "junk/morejunk";
    if (!fs::create_directories(path)) {
        std::cerr << "Failed to create directory " << path << ".\n";
    }
    return(0);
}

运行它,我得到了诸如:@K%C5?:%C0)%E0?:%C0%E9%93? 之类的目录。

我在让 Boost 正确链接时遇到了一些麻烦,但上面的程序现在可以编译并运行。如果有必要,一些信息:
-- 我使用的是 Mac (OSX 10.9.4)
-- GCC 和 Boost 都与 MacPorts 一起安装(使用 +gcc49 选项进行 Boost)
-- GCC 版本 4.9.2_1
-- Boost 版本 1.57.0_1
-- 我的 Makefile 看起来像

CC = /opt/local/bin/g++
FLAGS = -I/opt/local/include -L/opt/local/lib -lboost_system-mt -lboost_filesystem-mt
driver : driver.cpp
    $(CC) $(FLAGS) -o driver driver.cpp

欢迎提出任何建议;我已经有一段时间没有大量使用 C++了,而且我对 Boost 的经验不是很丰富。

【问题讨论】:

    标签: c++ boost boost-filesystem


    【解决方案1】:

    请确保将文件保存为 ASCII、latin1 或 UTF8。

    否则,您可能会因不兼容的库版本而出现未定义的行为。

    您可以使用DYLD_LIBRARY_PATH 来获取用于提升的首选库(您链接的库)。另见Is it OK to use DYLD_LIBRARY_PATH on Mac OS X? And, what's the dynamic library search algorithm with it?

    【讨论】:

    • 我的文件是 UTF8。我没有弄乱 DYLD_LIBRARY_PATH,因为很多网站声称这不是一个好主意,我不明白为什么。看起来这是不同库和编译器的常见 Mac OSX 问题。当我停用 Macports g++ 并使用预装的 g++ 时,问题突然消失了。
    • “盲目”做事可不是什么好主意。但它是进行非侵入式部署的关键机制(例如,部署到可能安装了冲突版本的库的机器上)。唯一的 / 更好 / 方法是对所有内容使用发行版打包版本 - 但这通常仅适用于非常大的产品/非常流行的开源
    【解决方案2】:

    我遇到了同样的目录名称错误问题。我使用brew install boost 安装了boost,使用brew install gcc6 安装了gcc。

    事实证明,boost 是使用 Apple 版本的 GCC 编译器构建的,而源文件是使用原始 GCC 编译器构建的。当我使用 Apple 的编译器构建您的源文件时,它确实可以工作。

    或者,使用您选择的编译器自行构建提升。

    另请参阅相关问题的答案https://stackoverflow.com/a/4798180/2535529

    【讨论】:

      猜你喜欢
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多