使用C++ 17中的<filesystem>成员链接错误

Wil*_*eng 14 c++ gcc c++17 std-filesystem

我在Ubuntu 16.04上使用gcc 7.2,我需要使用C++ 17中的新文件系统库.即使确实有一个名为experimental/filesystem的库,我也不能使用它的任何成员.例如,当我尝试编译此文件时:

#include <iostream>
#include <string>
#include <experimental/filesystem>
using namespace std;
namespace fs = std::experimental::filesystem::v1;

int main(){
    fs::path p1 = "/usr/share/";
}
Run Code Online (Sandbox Code Playgroud)

我收到一个编译错误,如下所示:

$ g++-7 test.cpp -std=c++17
/tmp/ccfsMnlG.o: In function `std::experimental::filesystem::v1::__cxx11::path::path<char [12], std::experimental::filesystem::v1::__cxx11::path>(char const (&) [12])':
test.cpp:(.text._ZNSt12experimental10filesystem2v17__cxx114pathC2IA12_cS3_EERKT_[_ZNSt12experimental10filesystem2v17__cxx114pathC5IA12_cS3_EERKT_]+0x73): undefined reference to `st
d::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我不认为代码有任何问题,因为我只是从网站上复制粘贴它.我使用的是错误的gcc版本吗?另外,为什么我需要<experimental/filesystem>而不仅仅是<filesystem>在C++ 17中呢?提前致谢.

S.M*_*.M. 13

添加标志-lstdc++fs:

$ g++-7 test.cpp -std=c++17 -lstdc++fs
Run Code Online (Sandbox Code Playgroud)

gcc 7.2仅支持C++ 17实验filesystem命名空间.我不知道,也许gcc 7.3 filesystem已经支持std 命名空间了.

  • `-lstdc ++ fs`必须在命令行中查找.cpp文件.如果使用`make`,请将其添加到`LDLIBS`变量中. (7认同)
  • 我在Arch Linux上有gcc 7.3,我仍然得到链接器错误,即使使用-lstdc ++ fs. (2认同)

Ric*_*ick 8

您也可以sudo apt install g++-8使用#include <filesystem>cppreference 来代替#include <experimental/filesystem>旧的 g++ 和 libstdc++ 版本。

如果我在 Ubuntu 中安装 gcc 8,我会拥有 2 个不同的 libstdc++ 库还是仅更新原始库?

您可能会有两个,即使较新的一个应该可以作为旧一个的替代品。

我注意到 alibstdc++-8-devg++-8.

这对我有用:

g++-8 -g -Wall -std=c++17 test.cpp -lstdc++fs

看来即使是g++-8,文件系统库也不会自动链接,还是需要提供-lstdc++fs-std=c++17在语言层面也是需要的。