gpt4 book ai didi

c++ - 将 std::filesystem::path 传递给函数段错误

转载 作者:太空狗 更新时间:2023-10-29 20:50:04 27 4
gpt4 key购买 nike

当我尝试使用 std::filesystem::path 作为函数参数时,它在我的机器上出现段错误。这是一个最小的例子:

#include <filesystem>

void thing(const std::filesystem::path& p) {
return;
}

int main() {
thing("test");
return 0;
}

此代码段导致来自 gdb 的以下回溯:

#0  0x0000563a5a3814b3 in std::vector<std::filesystem::__cxx11::path::_Cmpt, std::allocator<std::filesystem::__cxx11::path::_Cmpt> >::~vector (this=0x23, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/stl_vector.h:567
#1 0x0000563a5a38132c in std::filesystem::__cxx11::path::~path (this=0x3, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/fs_path.h:208
#2 0x0000563a5a381f74 in std::filesystem::__cxx11::path::_Cmpt::~_Cmpt (this=0x3, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/fs_path.h:643
#3 0x0000563a5a381f8f in std::_Destroy<std::filesystem::__cxx11::path::_Cmpt> (__pointer=0x3) at /usr/include/c++/8/bits/stl_construct.h:98
#4 0x0000563a5a381e3f in std::_Destroy_aux<false>::__destroy<std::filesystem::__cxx11::path::_Cmpt*> (__first=0x3, __last=0x0) at /usr/include/c++/8/bits/stl_construct.h:108
#5 0x0000563a5a381ab0 in std::_Destroy<std::filesystem::__cxx11::path::_Cmpt*> (__first=0x3, __last=0x0) at /usr/include/c++/8/bits/stl_construct.h:137
#6 0x0000563a5a3817c1 in std::_Destroy<std::filesystem::__cxx11::path::_Cmpt*, std::filesystem::__cxx11::path::_Cmpt> (__first=0x3, __last=0x0) at /usr/include/c++/8/bits/stl_construct.h:206
#7 0x0000563a5a3814c9 in std::vector<std::filesystem::__cxx11::path::_Cmpt, std::allocator<std::filesystem::__cxx11::path::_Cmpt> >::~vector (this=0x7ffd198df8a0 = {...}, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/stl_vector.h:567
#8 0x0000563a5a38132c in std::filesystem::__cxx11::path::~path (this=0x7ffd198df880<error reading variable: Cannot access memory at address 0x2b>, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/fs_path.h:208
#9 0x0000563a5a381247 in main () at /home/user/CLionProjects/test/main.cpp:8
#10 0x00007fd6bb96ab6b in __libc_start_main (main=0x563a5a381200 <main()>, argc=1, argv=0x7ffd198df9b8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffd198df9a8) at ../csu/libc-start.c:308
#11 0x0000563a5a38113a in _start ()

我在 Ubuntu 19.10 上使用 GCC 8.3,我让其他人在 Windows 上编译和运行这段代码没有问题,所以它可能是 libstdc++

中的一个错误

最佳答案

我认为问题在于 Ubuntu 在单个安装中混合了 GCC 版本。在 Ubuntu 上,默认的 GCC 是版本 8,但是 libstdc++.so.6 库来自 GCC 9。对于 GCC 8,std::filesystem 定义在一个单独的库中, libstdc++fs.a,必须显式链接到。在 GCC 9 中,std::filesystem 符号位于主 libstdc++.so 库中。由于 Ubuntu 安装困惑,libstdc++.so 中的 GCC 9 符号可能会满足使用 GCC 8 编译的代码中 undefined reference ,应该 >libstdc++fs.a。因为 GCC 9 中的 std::filesystem 符号与 GCC 8 中这些符号的实验版本不兼容,它似乎链接正常但在运行时崩溃。

如果您确保使用 -lstdc++fs 链接并确保该选项出现在所有目标文件之后,它应该可以正常工作,例如这应该有效:

g++ foo.o bar.o -lstdc++fs

但这将起作用:

g++ -lstdc++fs foo.o bar.o

应该对 Ubuntu gcc-8 包进行更新以解决此问题,方法是确保 -lstdc++fs 选项出现在所有其他输入之后文件。有关详细信息,请参阅 https://bugs.launchpad.net/ubuntu/+source/gcc-8/+bug/1824721

gcc-9 编译也可以,因为当使用 GCC 9 编译时,不需要为 std 链接到 -lstdc++fs: :filesystem(在 GCC 9 中,只有 std::experimental::filesystem 符号需要它)。

关于c++ - 将 std::filesystem::path 传递给函数段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56615841/

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