В моем приведенном ниже коде продолжалась ошибка ошибки сегментации, и я не могу понять, почему. Помогите, пожалуйста ~~ Моя цель - прочитать папку и все ее подпапки, чтобы найти все файлы, заканчивающиеся расширением «.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;
}
А как насчет других версий Boost?
@john я сохранил рабочую копию, но даже это не работает
Библиотека Boost.filesystem теперь является частью стандартной библиотеки. У вас есть шанс использовать C++ 17?
Не могу воспроизвести, у меня работает нормально. Вы уверены, что это не проблема с разрешениями? Вы пробовали запускать его как sudo?
Это может быть из-за проблем с путями, возможно, вам будет лучше, если вы используете диспетчер пакетов для установки boost. apt подойдет.





Код в порядке, для стиля уменьшено следующее:
#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;
}
}
Примечания:
код неверен для более поздних версий boost (*it больше не поддерживает потоковую передачу)
вы пытаетесь создать ссылку на созданную пользователем версию библиотек 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
Попробуйте вспомнить последнее изменение, которое вы внесли, когда оно перестало работать.