Почему этот код приводит к ошибке ошибки сегментации? - PullRequest
2 голосов
/ 08 июня 2019

Я собираю это с помощью cmake, используя gcc на Ubuntu 19.04. Когда я запускаю это, это приводит к исключению ошибки сегментации внутри функции list_dir. Понятия не имею почему. Пожалуйста помоги. Любая помощь будет принята с благодарностью.

#include <string>
#include <iostream>
#include <vector>
#include <filesystem>

namespace fs = std::filesystem;

static void list_dir(const std::string &path, bool recursive){

    try{
        std::vector<std::string> dirs;

        try{
            for (const auto &entry : fs::directory_iterator(path)){
                std::cout << entry << "\n";     

                if(recursive && entry.is_directory() && !entry.is_symlink())
                    dirs.push_back(entry.path().string());
            }
        }
        catch(const fs::filesystem_error &err){
            std::cerr << "err: " << err.what() << "\n";
        }

        if(recursive){
            for (const auto &p : dirs)
                list_dir(p, true);
        }
    }
    catch(const std::exception &err){
        std::cerr << "err: " << err.what() << "\n";
    }
}

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

    if (argc != 2)
    {
        std::cerr << "Usage: index <dir>\n";
        return 1;
    }

    list_dir(argv[1], true);
    std::cout << "Done.\n";
    return 0;
}

Обновление: исключение происходит в этой строке кода

for (const auto &entry : fs::directory_iterator(path))

Обновление: если кому-то интересно, вот файл cmake

cmake_minimum_required(VERSION 3.1)
set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")
project(index VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17) 
file(GLOB_RECURSE SourceFiles "src/*.cpp" "src/*.h")
add_executable(${PROJECT_NAME} ${SourceFiles})

1 Ответ

1 голос
/ 08 июня 2019

Я только что решил проблему, я не связывался с библиотекой файловой системы, которая вызывала ошибку, хотя я понятия не имею, почему код все еще может быть скомпилирован без надлежащих библиотек связывания ...

В cmake, после того как я добавил:

target_link_libraries(${PROJECT_NAME} "-lstdc++fs") 

Теперь все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...