当前位置: 首页 > 知识库问答 >
问题:

将 std::文件系统::p一次性传递到函数

笪波鸿
2023-03-14

当我试图使用std::filesystem::path作为函数参数时,它在我的机器上执行segfaults。下面是一个最小的示例:

#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中的一个错误

共有3个答案

葛阳
2023-03-14
匿名用户

请链接< code>-lstdc fs库,我们假设源文件是fileSys.cpp,然后编译如下,< br > < code > g-STD = c 17 filesys . CPP-lstdc fs-o fs

我使用的是< code>GCC 8.1.0和< code>Ubuntu 16.04.1 LTS。< br >关于这个主题已经有一个类似的问题,您可以在文件系统链接器错误中找到它

贲绪
2023-03-14

我能够通过从此PPA安装GCC和G 9来解决此问题:https://launchpad.net/~ubuntu-toolchain-r/ 存档/ ubuntu /测试

乌和畅
2023-03-14

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

如果您确保与-lstdc fs链接并确保该选项位于所有目标文件之后,它应该可以正常工作,例如。这应该有效:

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

但这行不通:

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

应该有一个Ubuntu gcc-8包的更新来解决这个问题,确保< code>-lstdc fs选项在所有其他输入文件之后。有关更多详细信息,请参见https://bugs.launchpad.net/ubuntu/来源/gcc-8/ bug/1824721

使用gcc-9编译也可以,因为在使用gcc 9编译时,不需要链接到-stdc-fsfor (对于gcc 9,只需要 符号)。

 类似资料:
  • 问题内容: 我有一个主类,期望使用-D选项传递某些属性。我可以通过将其作为VM选项发送来在IDE中访问它。 我使用Maven并在尝试以下操作时将此应用程序打包到jar文件中: 要么 没有获取环境系统属性。 关于发生了什么的任何指示? 问题答案: 在。之前传递参数。如果在jar文件之后传递它们,它们将被解释为命令行参数并传递给in 。喜欢,

  • Im使用RCONE在微型存储桶和共享存储之间传输数据。我正在迁移一个商店,数据量约为200GB的产品图片。每个图片都有自己的文件夹/路径。因此,有很多文件夹需要创建来保存。Rclone安装在新服务器上,存储通过san连接到服务器。传输已经进行了一个多星期,我们现在的容量是170GB。一切都很好,但在我看来它真的很慢。从bucket到经典文件系统的传输有这么慢,这正常吗?

  • 我创建了一个docker容器,然后我创建了一个文件并退出该容器。 当我重新启动容器时: 如何再次启动同一容器并将文件放入其中? 如何导出带有文件更改的容器?

  • 我正在通过JRuby运行一个本地Rails服务器(WEBrick),并想测试一些最终将在Torquebox上运行的代码。我试图通过访问一些定制的Java系统属性。在Torquebox上运行时,这些系统属性将可用,因此为了在本地测试代码,我使用“-J”参数在命令行上传递系统属性 当我运行JRuby时,一切正常,我可以访问我的自定义属性。 这只是打印“my_value”来输出。 我的问题是在运行本地R

  • 我正在尝试编写一个类模板,在内部它使用一个函数(BFGS优化的实现,由环境提供),接口如下: 其中< code>fn和< code>gr是类型的函数指针 和 分别是。我的< code>C 类模板如下所示: 这样,它可以由任何具有两个指定成员函数的类进行实例化,例如: 这可能吗?或者也许有更好的方法来做到这一点 - 将两个成员函数分别作为函数指针传递?(如果目标函数和相应的梯度很简单,那么编写两个函