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

Link errors using <filesystem> members in C++17

本文关键字:成员 链接 错误 gt lt filesystem 使用 C++17      更新时间:2023-10-16

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

#include <iostream>
#include <string>
#include <experimental/filesystem>
using namespace std;
namespace fs = std::experimental::filesystem::v1;
int main(){
fs::path p1 = "/usr/share/";
}

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

$ 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

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

添加标志-lstdc++fs

$ g++-7 test.cpp -std=c++17 -lstdc++fs

GCC 7.2 仅支持 C++17 实验性filesystem命名空间。我不知道,也许 gcc 7.3 已经支持 stdfilesystem命名空间。

您还可以sudo apt install g++-8并使用#include <filesystem>作为描述的cpp首选项,而不是在较旧的g++和libstdc++版本中#include <experimental/filesystem>

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

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

我注意到libstdc++-8-devg++-8一起安装.

这对我有用:

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

看来即使使用 g++-8,文件系统库也不会自动链接,你仍然需要提供-lstdc++fs,语言级别也需要-std=c++17

以下内容对我有用:

在代码中:

#include <filesystem>
namespace filesystem = std::filesystem;

在CMakeLists中:

set (CMAKE_CXX_FLAGS "-lstdc++fs -std=c++17")

在带有 GCC 10 的 Ubuntu 18.04 上。

一个尚未提及的让我躲避了几个小时的基本要素是在默认的CMakeLists中.txt:

target_compile_features(compare_files PUBLIC cxx_std_11)
需要改为:
target_compile_features(compare_files PUBLIC cxx_std_17)