Link 在 C++17 中使用 <filesystem> 成员的错误
Link errors using <filesystem> members in C++17
我在 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/";
}
我收到如下所示的编译错误:
$ 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?另外,为什么在 C++17 中我需要 <experimental/filesystem>
而不是 <filesystem>
?提前致谢。
添加标志-lstdc++fs
:
$ g++-7 test.cpp -std=c++17 -lstdc++fs
gcc 7.2 仅支持 C++17 实验性 filesystem
命名空间。我不知道,也许 gcc 7.3 已经支持 std filesystem
命名空间。
您还可以 sudo apt install g++-8
并使用 #include <filesystem>
作为 cppreference 描述,而不是旧 g++ 和 libstdc++ 版本中的 #include <experimental/filesystem>
。
If I install gcc 8 in Ubuntu, will I have 2 different libstdc++ library or merely the original one get updated?
you'll probably have two even though the newer one should work as a drop-in replacement for the old one.
我注意到 libstdc++-8-dev
与 g++-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")
在 Ubuntu 18.04 上使用 GCC 10。
有一个 not-yet-mentioned 基本要素是默认的 CMakeLists.txt:
target_compile_features(compare_files PUBLIC cxx_std_11)
需要改为:
target_compile_features(compare_files PUBLIC cxx_std_17)
我在 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/";
}
我收到如下所示的编译错误:
$ 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?另外,为什么在 C++17 中我需要 <experimental/filesystem>
而不是 <filesystem>
?提前致谢。
添加标志-lstdc++fs
:
$ g++-7 test.cpp -std=c++17 -lstdc++fs
gcc 7.2 仅支持 C++17 实验性 filesystem
命名空间。我不知道,也许 gcc 7.3 已经支持 std filesystem
命名空间。
您还可以 sudo apt install g++-8
并使用 #include <filesystem>
作为 cppreference 描述,而不是旧 g++ 和 libstdc++ 版本中的 #include <experimental/filesystem>
。
If I install gcc 8 in Ubuntu, will I have 2 different libstdc++ library or merely the original one get updated?
you'll probably have two even though the newer one should work as a drop-in replacement for the old one.
我注意到 libstdc++-8-dev
与 g++-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")
在 Ubuntu 18.04 上使用 GCC 10。
有一个 not-yet-mentioned 基本要素是默认的 CMakeLists.txt:
target_compile_features(compare_files PUBLIC cxx_std_11)
需要改为:
target_compile_features(compare_files PUBLIC cxx_std_17)