我正在尝试在Ubuntu 19.04上的给定目录中读取文件。我打算在标准库中使用directory_iterator。我正在使用CLion IDE,它在目录“ usr / bin / c ++”中使用编译器。我猜这是g ++编译器,我系统中的g ++版本是8.3。我正在使用的C ++版本是C ++ 17。
我能够在Windows 10的Visual Studio 2017上成功运行代码,但是在使用CLion时,代码在Ubuntu上产生了分段错误错误。下面的代码来自cppreference页面中关于directory_iterator的内容。
#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::create_directories("sandbox/a/b");
std::ofstream("sandbox/file1.txt");
std::ofstream("sandbox/file2.txt");
for(auto& p: fs::directory_iterator("sandbox"))
std::cout << p.path() << '\n';
fs::remove_all("sandbox");
}
我希望代码能够打印给定文件夹中的文件,但我却得到了Segfault。
进程结束,退出代码为139(信号11:SIGSEGV中断)。
此问题背后的原因可能是什么?问题可能与CMake有关吗?
答案 0 :(得分:4)
它看起来像是gcc 8.3中的错误
如果您run it,则无法链接。可能是由于您的环境中的错误导致了段错误。
但是,如果您更新到gcc 9.1:it works fine。
Clang 9为fine too,但之前的所有版本均无法编译
编辑:如 Galik 所说,如果添加标志-lstdc++fs
it seems to work
来源:https://en.cppreference.com/w/cpp/filesystem
注释
使用此库可能需要其他编译器/链接器选项。 GNU实现需要与-lstdc ++ fs链接,而LLVM实现需要与-lc ++ fs链接