Ответ 1
Если /path/to/some/dir
не является обычным каталогом (например, это символическая ссылка), то is_directory
не требуется возвращать значение true, даже если символическая ссылка относится к каталогу
Посмотрите
Я искал высоко и низко, чтобы ответить на этот вопрос, и я не могу отладить проблему!
Итак, это то, что у меня есть.
Я установил 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
Дополнения:
Я уверен, что мне не хватает чего-то явно очевидного, но я признаю, что мне нужна помощь.
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
Если /path/to/some/dir
не является обычным каталогом (например, это символическая ссылка), то is_directory
не требуется возвращать значение true, даже если символическая ссылка относится к каталогу
Посмотрите
Проблема заключается не в вашем коде, так как ваш MCVE компилируется в онлайн-компиляторе и дает успешный выход. Одно из возможных объяснений заключается в том, что Boost был скомпилирован с другой стандартной библиотекой, чем то, с чем вы скомпилируете свою программу, как было предложено проблемой сбой при использовании boost 1.55. 0 из приложения, которое основано на libstdС++ на Mac. libc++
и libstdc++
не являются бинарно совместимыми из-за их реализации строки (теперь это может быть неверно, но в прошлом это было верно.) Также имейте в виду, что на Mac g++
может быть символически привязана к clang++
.
Решение:
Скомпилируйте свою программу с помощью той же библиотеки std. Попробуйте clang++ -stdlib=libc++ ...
или clang++ -stdlib=libstdc++ ...
Перекомпилируйте Boost из источника, используя другую библиотеку std, если вы предпочитаете