当我尝试使用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++
中的错误
答案 0 :(得分:3)
我认为问题在于Ubuntu在单个安装中混合了GCC版本。在Ubuntu上,默认的GCC是版本8,但是libstdc++.so.6
库来自GCC9。在GCC 8中,std::filesystem
的定义位于单独的库libstdc++fs.a
中,必须明确链接到该库。 。在GCC 9中,std::filesystem
符号位于主libstdc++.so
库中。由于安装了Ubuntu,因此libstdc++.so
中的GCC 9符号可能满足用libstdc++fs.a
满足应该的用GCC 8编译的代码中未定义的引用。由于GCC 9中的std::filesystem
符号与GCC 8中的这些符号的实验版本不兼容,因此似乎可以链接OK,但在运行时会崩溃。
如果您确保与-lstdc++fs
链接并且确保该选项位于所有目标文件之后,例如,这应该工作:
g++ foo.o bar.o -lstdc++fs
但这将不有效:
g++ -lstdc++fs foo.o bar.o
应该通过确保gcc-8
选项位于所有其他输入文件之后来对Ubuntu -lstdc++fs
软件包进行更新以解决此问题。有关更多详细信息,请参见https://bugs.launchpad.net/ubuntu/+source/gcc-8/+bug/1824721
使用gcc-9
进行编译也是可行的,因为使用GCC 9进行编译时,-lstdc++fs
无需链接到std::filesystem
(对于GCC 9,仅{{1} }符号)。
答案 1 :(得分:1)
我能够通过以下PPA安装GCC和G ++ 9来解决此问题:https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test
答案 2 :(得分:0)
请链接-lstdc++fs
库,让我们考虑源文件为fileSys.cpp,然后按如下所示进行编译,
g++ -std=c++17 fileSys.cpp -lstdc++fs -o fs
我正在使用GCC 8.1.0
和Ubuntu 16.04.1 LTS
。
此主题已经存在类似的问题,您可以在filesystem linker error