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

Posted

技术标签:

【中文标题】C++ 11 Boost 1.65 recursive_directory_iterator 给出分段错误错误【英文标题】:C++ 11 Boost 1.65 recursive_directory_iterator giving segmentation fault error 【发布时间】:2018-08-27 07:39:10 【问题描述】:

我下面的代码一直遇到分段错误错误,我似乎无法弄清楚原因。请帮忙~~ 我的目标是读取一个文件夹及其所有子文件夹以查找所有以扩展名“.txt”结尾的文件,因此我使用 boost 的递归目录迭代器来帮助完成任务。这个问题突然出现,因为我的代码上周运行良好。

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 上运行,我用 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;

【问题讨论】:

试着回想一下你在它停止工作时所做的最后一次更改。 其他版本的 Boost 怎么样? @john 我保留了一份工作副本,但即使这样也不起作用 Boost.filesystem 库现在是标准库的一部分。你有机会使用 C++17 吗? 我无法复制,它对我来说很好用。你确定这不是权限问题吗?您是否尝试过将其作为 sudo 运行? 【参考方案1】:

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

提升 1.65.1:Live On Wandbox 提升 1.68.0:Live On Wandbox
#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 库版本。但是,您指定链接器目录 -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.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 给出分段错误错误的主要内容,如果未能解决你的问题,请参考以下文章

Debian存储库中没有Boost.Stacktrace

python嵌入C++,函数返回shared_ptr(pybind11/boost_python)

C++:使用 Boost 序列化来写入/读取文件 [关闭]

使用 Boost 库 Qt C++ 更新翻译文件

在 boost python 中暴露 C++ 接口

Sun C++ 编译器和 Boost