C ++ 11 Boost 1.65 recursive_directory_iterator, выдающий ошибку ошибки сегментации - PullRequest
0 голосов
/ 27 августа 2018

Мой код ниже продолжал работать с ошибкой ошибки сегментации, и я не могу понять, почему.Помогите pls ~~ Моя цель - прочитать папку и все ее подпапки, чтобы найти все файлы, заканчивающиеся расширением ".txt", поэтому я использую итератор директивы 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;
}

1 Ответ

0 голосов
/ 28 августа 2018

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

#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 
...