Boost Filesystem. is_directory никогда не работает

Я искал высоко и низко, чтобы ответить на этот вопрос, и я не могу отладить проблему!

Итак, это то, что у меня есть.

Я установил boost через homebrew (Mac OSX Mavericks) версии 1.55.0.

Другие библиотеки 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 через интерфейс Add Library.

Вот код, который я запускаю, который никогда не работает. (значение 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;
}

Результат вывода всегда system: 2 из boost:: system:: error_code

Дополнения:

  • При попытке печати пути приложение сбой
  • Я снова скомпилировал boost с С++ 11 вместо стандартного, но ничего не изменилось.

Я уверен, что мне не хватает чего-то явно очевидного, но я признаю, что мне нужна помощь.

EDIT:

Итак, я выделил его в один файл 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:

В запросе в комментариях есть /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

С++ версия:

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

Ответы

Ответ 1

Если /path/to/some/dir не является обычным каталогом (например, это символическая ссылка), то is_directory не требуется возвращать значение true, даже если символическая ссылка относится к каталогу

Посмотрите

Ответ 2

Проблема заключается не в вашем коде, так как ваш MCVE компилируется в онлайн-компиляторе и дает успешный выход. Одно из возможных объяснений заключается в том, что Boost был скомпилирован с другой стандартной библиотекой, чем то, с чем вы скомпилируете свою программу, как было предложено проблемой сбой при использовании boost 1.55. 0 из приложения, которое основано на libstdС++ на Mac. libc++ и libstdc++ не являются бинарно совместимыми из-за их реализации строки (теперь это может быть неверно, но в прошлом это было верно.) Также имейте в виду, что на Mac g++ может быть символически привязана к clang++.

Решение:

  • Скомпилируйте свою программу с помощью той же библиотеки std. Попробуйте clang++ -stdlib=libc++ ... или clang++ -stdlib=libstdc++ ...

  • Перекомпилируйте Boost из источника, используя другую библиотеку std, если вы предпочитаете