新文件系统库和clang ++ 7

时间:2018-12-16 22:27:35

标签: c++ c++17

我试图推出新的filesystem STL库,但是由于某种原因出现了错误。 Clang++7网站表明它应该支持新的filesystem库–实际上,我相信clang的运行要早于g++

我使用了另一个Stack Exchange帖子中的一些代码,因此根据投票的数量应该是有效的。这应该转到指定的目录并打印该目录中的所有文件。这是代码。

#include <iostream>
#include <string>
#include <experimental/filesystem>

namespace fs = std::experimental::filesystem;

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

    std::string path = "/home/.../Downloads";
    for (const auto & entry : fs::directory_iterator(path))
    {
        std::cout << entry.path() << std::endl;
    }

}

我收到的错误消息是:

CMakeFiles/filesystem_app.dir/main.cpp.o: In function `main':
/media/.../clangcpp/filesystem_app/main.cpp:13: undefined reference to `std::experimental::filesystem::v1::__cxx11::directory_iterator::operator*() const'
/media/.../clangcpp/filesystem_app/main.cpp:13: undefined reference to `std::experimental::filesystem::v1::__cxx11::directory_iterator::operator++()'
CMakeFiles/filesystem_app.dir/main.cpp.o: In function `path<std::__cxx11::basic_string<char>, std::experimental::filesystem::v1::__cxx11::path>':
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.5.0/../../../../include/c++/5.5.0/experimental/fs_path.h:198: undefined reference to `std::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'
CMakeFiles/filesystem_app.dir/main.cpp.o: In function `directory_iterator':
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.5.0/../../../../include/c++/5.5.0/experimental/fs_dir.h:188: undefined reference to `std::experimental::filesystem::v1::__cxx11::directory_iterator::directory_iterator(std::experimental::filesystem::v1::__cxx11::path const&, std::experimental::filesystem::v1::directory_options, std::error_code*)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我确保包括experimental/filesystem标头,而不仅仅是filesystem,它删除了Clion中的所有红色花体。我试图从CLion以及从命令行进行编译。我使用的编译字符串是:

  clang++-7 -Wall -std=c++17 main.cpp -o app

有人知道这里有什么问题吗?在编译错误消息中,我看到了对std::experimental::filesystem::v1::__cxx11::..的引用,我想知道为什么它没有说cxx17,但是我不确定这是否是问题的原因。我在上面的编译字符串中明确指出了c++17

1 个答案:

答案 0 :(得分:5)

filesystem仍处于试验阶段,需要一个额外的库。

如果您使用的是libstdc ++,请与-lstdc++fs(或target_link_libraries(${PROJECT_NAME} stdc++fs))链接。

对于libc ++,请使用-lc++fs(与CMake命令类似)。