gpt4 book ai didi

C++ 11 Boost 1.65 recursive_directory_iterator 给出段错误

转载 作者:太空狗 更新时间:2023-10-29 21:33:15 26 4
gpt4 key购买 nike

我下面的代码不断遇到段错误,我似乎无法弄清楚原因。请帮助~~我的目标是读取一个文件夹及其所有子文件夹以查找所有以扩展名“.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 上运行,我使用 boost 1.65 静态编译我的 test.cpp :

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;
}

最佳答案

代码没问题,为样式缩减如下:

#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. 您尝试链接到 /home/dj/boost_1_65_1 中自定义构建版本的 Boost 库。但是,您指定链接器目录 -L/home/dj/boost_1_65_1 而库通常内置到 stage/lib 中,因此您期望 -L/home/dj/boost_1_65_1/stage/lib 找到库的正确版本。

很可能您链接了错误版本的库(与您在编译时使用的 header 不匹配)。

要在运行时诊断正在链接哪些库,请使用 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.0libboost_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 

关于C++ 11 Boost 1.65 recursive_directory_iterator 给出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52034698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com