12

当我尝试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++

4

3 回答 3

15

我认为问题在于 Ubuntu 在单个安装中混合了 GCC 版本。在 Ubuntu 上,默认的 GCC 是版本 8,但该libstdc++.so.6库来自 GCC 9。对于 GCC 8,std::filesystem定义位于单独的库中libstdc++fs.a,必须明确链接到该库。在 GCC 9 中,std::filesystem符号位于主libstdc++.so库中。由于混淆了 Ubuntu 安装,因此 GCC 9 符号可能满足libstdc++.so使用 GCC 8 编译的代码中的未定义引用,而. 因为GCC 9 中的符号与 GCC 8 中这些符号的实验版本不兼容,所以它似乎可以链接,但在运行时崩溃。libstdc++fs.astd::filesystem

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

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

但这不起作用

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

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

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

于 2019-07-03T07:15:23.323 回答
1

我可以通过从这个 PPA 安装 GCC 和 G++ 9 来解决这个问题:https ://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test

于 2019-06-16T05:00:59.980 回答
1

请链接-lstdc++fs库,让我们考虑源文件是 fileSys.cpp 然后编译如下,
g++ -std=c++17 fileSys.cpp -lstdc++fs -o fs

我正在使用GCC 8.1.0Ubuntu 16.04.1 LTS
关于这个主题已经有一个类似的问题,你可以在文件系统链接器错误中找到它

于 2019-06-16T07:37:47.837 回答