C++ 11 Boost 1.65 recursive_directory_iterator выдает ошибку ошибки сегментации

В моем приведенном ниже коде продолжалась ошибка ошибки сегментации, и я не могу понять, почему. Помогите, пожалуйста ~~ Моя цель - прочитать папку и все ее подпапки, чтобы найти все файлы, заканчивающиеся расширением «.txt», поэтому я использую итератор каталогов boost recurisve, чтобы помочь в достижении этой задачи. Эта проблема возникла внезапно, поскольку на прошлой неделе мой код работал нормально.

test.cpp:

#include <sstream>
#include <iostream>
#include "/home/dj/boost_1_65_1/boost/filesystem.hpp"
using namespace std;
int main()
{
    using namespace boost::filesystem;
    recursive_directory_iterator end;
    for (recursive_directory_iterator it("./"); it != end; ++it)
    {
        std::cout << *it << endl;
    }
    return 0;
}

Я работаю в Linux, и я компилирую свой test.cpp с boost 1.65 как статический:

g++ -g -I /home/dj/boost_1_65_1 test.cpp -static -static-libgcc -o delete -static-libstdc++ -std=c++11 -L/home/dj/boost_1_65_1 -lboost_filesystem -lboost_system

с помощью gdb и некоторого cout я обнаружил, что ошибка возникла из строки ниже.

for (recursive_directory_iterator it("./"); it != end; ++it)

каким-то образом, когда я вызываю "recursive_directory_iterator", моя система вылетает, давая эту ошибку

Program received signal SIGSEGV, Segmentation fault.
0x00000000004f1c8b in memcpy ()

та же самая ошибка сохраняется, даже если я уменьшу код до

int main()
{
    using namespace boost::filesystem;
    recursive_directory_iterator it("./");
    return 0;
}

Попробуйте вспомнить последнее изменение, которое вы внесли, когда оно перестало работать.

john 27.08.2018 09:46

А как насчет других версий Boost?

einpoklum 27.08.2018 09:47

@john я сохранил рабочую копию, но даже это не работает

DJ_ 27.08.2018 09:49

Библиотека Boost.filesystem теперь является частью стандартной библиотеки. У вас есть шанс использовать C++ 17?

user4640261 27.08.2018 10:00

Не могу воспроизвести, у меня работает нормально. Вы уверены, что это не проблема с разрешениями? Вы пробовали запускать его как sudo?

Tu.Ma. 27.08.2018 11:25

Это может быть из-за проблем с путями, возможно, вам будет лучше, если вы используете диспетчер пакетов для установки boost. apt подойдет.

user4640261 27.08.2018 11:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
678
1

Ответы 1

Код в порядке, для стиля уменьшено следующее:

#include <iostream>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
int main()
{
    for (recursive_directory_iterator it("./"), end; it != end; ++it) {
        std::cout << it->path() << std::endl;
    }
}

Примечания:

  1. код неверен для более поздних версий boost (*it больше не поддерживает потоковую передачу)

  2. вы пытаетесь создать ссылку на созданную пользователем версию библиотек Boost в /home/dj/boost_1_65_1. Однако вы указываете каталог компоновщика -L/home/dj/boost_1_65_1, тогда как обычно библиотеки встраиваются в stage/lib, поэтому можно ожидать, что -L/home/dj/boost_1_65_1/stage/lib найдет правильную версию библиотек.

Скорее всего, вы связываете неправильную версию библиотек (не совпадающую с заголовками, которые вы используете во время компиляции).

Чтобы определить, какие библиотеки подключаются во время выполнения, используйте ldd. Например, для моего примера:

g++ -L /home/sehe/custom/boost_1_67_0/stage/lib/ -I /home/sehe/custom/boost_1_67_0/ test.cpp -lboost_system -lboost_filesystem

За ldd a.out вы получаете:

    linux-vdso.so.1 =>  (0x00007fff0bfaf000)
    libboost_system.so.1.67.0 => not found
    libboost_filesystem.so.1.67.0 => not found
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5e8fcb2000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5e8fa9a000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5e8f6d0000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5e8f3c7000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5e9003e000)

Действительно, вы можете видеть, что у меня нет libboost_system.so.1.67.0 или libboost_filesystem.so.1.67.0 в каталоге системной библиотеки, и он их не найдет. Запуск не удастся:

$ ./a.out 
./a.out: error while loading shared libraries: libboost_system.so.1.67.0: cannot open shared object file: No such file or directory

Вы можете сообщить компоновщику среды выполнения путь к вашей библиотеке:

LD_LIBRARY_PATH=~/custom/boost_1_67_0/stage/lib ./a.out 

Другие вопросы по теме