我下面的代码一直遇到分段错误错误,我似乎无法弄清楚原因。请帮忙~~ 我的目标是读取一个文件夹及其所有子文件夹,以查找所有以扩展名".txt"结尾的文件,所以我使用 boost 的递归目录迭代器来帮助完成任务。这个问题突然出现,因为我的代码上周运行良好。
测试.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 上运行,我编译了我的测试.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.65.1:活在魔杖盒上
- 增强 1.68.0:活在魔杖盒上
#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
不再可输出流式传输(您尝试链接到
/home/dj/boost_1_65_1
中 Boost 库的 cusomt 构建版本。但是,你指定链接器目录-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