【问题标题】:Boost Filesystem. is_directory never works提升文件系统。 is_directory 从不工作
【发布时间】:2014-07-20 06:27:32
【问题描述】:

我一直在寻找这个问题的答案,但我似乎无法调试问题!

所以,这就是我所拥有的。

我已经通过 homebrew (Mac OSX Mavericks) 版本 1.55.0 安装了 boost。

其他 boost 库工作正常,但 boost::filesystem 似乎无法与实际文件系统交互。

这就是我链接它的方式(使用 QT)

macx: LIBS += -L$$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/lib/ -lboost_system-mt
macx: LIBS += -L$$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/lib/ -lboost_filesystem-mt

INCLUDEPATH += $$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/include
DEPENDPATH += $$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/include

macx: PRE_TARGETDEPS += $$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/lib/libboost_filesystem.a
macx: PRE_TARGETDEPS += $$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/lib/libboost_system.a

请注意,这是 qt creator 通过添加库界面自动生成的。

这是我正在运行的代码,但它永远无法运行。 (意思是 isDir 总是false

namespace fs = boost::filesystem;
boost::system::error_code c;
fs::path path("/path/to/some/dir"); // Have tried '.' '/' './' '/usr' Everything!
bool isDir = boost::filesystem::is_directory(path, c);

if(!isDir) {
    std::cout << "Error Response: " << c << std::endl;
    ui->directoryEdit->setStyleSheet("background-color: red;");
}
else {
    std::cout << "Is a directory!" << std::endl;
}

输出的结果总是来自 boost::system::error_code 的system: 2

其他发现:

  • 尝试打印路径时,应用程序崩溃
  • 我已经用 c++11 而不是标准重新编译了 boost,但没有任何改变。

我确信我遗漏了一些明显的东西,但我承认我需要帮助。

编辑:

所以我把它隔离成一个单独的 main.cpp 文件:

#include <boost/filesystem.hpp>
#include <boost/system/error_code.hpp>
#include <iostream>
#include <string>

int main(int argc, char *argv[]) {

    namespace fs = boost::filesystem;
    boost::system::error_code c;
    fs::path path("."); // Have tried '.' '/' './' '/usr' Everything!
    bool isDir = boost::filesystem::is_directory(path, c);

    if(!isDir) {
        std::cout << "Error Response: " << c << std::endl;
    }
    else {
        std::cout << "Is a directory!" << std::endl;
    }

    return 0;
 }

然后我用

编译/运行
g++ test_boost.cpp -o main.out -lboost_system -lboost_filesystem
./main.out

而生成的响应是

Error Response: system:2

非常令人沮丧。打算用旧版本试试

编辑 2:

这里 cmets 中的每个请求是 /usr/local/Cellar/boost/1.55.0_1/INSTALL_RECEIPT.json

{"compiler":"clang","HEAD":"4bf4ee77fa858bb5e56406504cf86564bd5ece3d","built_as_bottle":true,"stdlib":"libcxx","tapped_from":"Homebrew/homebrew","unused_options":["--with-mpi","--c++11","--with-icu","--without-static","--with-python","--universal","--without-single"],"poured_from_bottle":true,"used_options":[],"time":1399557362}  

编辑 3:

g++ 版本:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.2.0
Thread model: posix

c++ 版本:

Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.2.0
Thread model: posix

【问题讨论】:

  • 当您尝试打印路径时程序崩溃的事实是可疑的。也许您在程序的其他地方发生了内存损坏?尝试制作一个绝对最小的示例程序(例如,只是您发布的代码,修剪并放入 main 函数 - 不是 Qt),看看那里会发生什么。
  • 我已经做到了。在调试时current_path 顺便也给了我一个空字符串
  • 你能告诉我们Homebrew/Cellar/boost/1.55.0_1/INSTALL_RECEIPT.json的内容吗?我无法使用自制编译的 boost 在 OS X Mavericks 上重现您的失败。
  • @sharth 我已将其添加到原始帖子中。
  • “system:2”错误消息表示 ENOENT(没有这样的文件或目录)。这个问题还能重现吗?我目前没有 Mac 来测试它,并且代码在当前的 Linux 机器上适用于我。

标签: c++ macos boost boost-filesystem


【解决方案1】:

问题不在于您的代码,因为您的 MCVE 在在线编译器上编译并提供了成功的输出。一种可能的解释是,正如问题 crash when using boost 1.55.0 from an application that is based on libstdc++ on Mac 所建议的那样,Boost 是使用与您正在编译程序的标准库不同的标准库编译的。 libc++libstdc++ 不是二进制兼容的,因为它们实现了字符串(现在可能不正确,但过去绝对正确。)还要记住,在 Mac 上,g++ 可能符号链接到clang++.

解决方案:

  • 使用与 Boost 相同的标准库编译程序。试试clang++ -stdlib=libc++ ...clang++ -stdlib=libstdc++ ...

  • 如果您愿意,可以使用不同的 std 库从源代码重新编译 Boost

【讨论】:

  • 感谢您的回复。不幸的是,这个项目早已不复存在,我运行它的机器也是如此。所以我实际上无法验证这是正确的答案。
【解决方案2】:

如果/path/to/some/dir 不是常规目录(例如,它是一个符号链接),那么is_directory 不需要返回true,即使符号链接引用 到一个目录

看看

【讨论】:

  • 但是,如果您查看我的 cmets,我已经尝试了许多不同的目录。例如“/”或“.”绝对应该有效,但它没有!
  • 如果文件或目录存在,但不是被测试的类型,返回的错误应该是0。错误2(ENOENT)表示文件或目录不存在。 (如果它是符号链接并且符号链接目标不存在,也可能发生)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多