Link errors using <filesystem> members in C++17
I'm using gcc 7.2 on Ubuntu 16.04, and I need to use the new filesystem library from C++17. Even though there is indeed a library called experimental/filesystem, I can't use any of its members. For example, when I try to compile this file:
#include <iostream>
#include <string>
#include <experimental/filesystem>
using namespace std;
namespace fs = std::experimental::filesystem::v1;
int main(){
fs::path p1 = "/usr/share/";
}
I get a compilation error which looks like this:
$ 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
What am I doing wrong? I don't think there's anything wrong with the code, since I just copy-pasted it from a website. Am I using the wrong version of gcc? Also, why do I need <experimental/filesystem>
instead of just <filesystem>
in C++17? Thanks in advance.
Solution 1:
Add the flag -lstdc++fs
:
$ g++-7 test.cpp -std=c++17 -lstdc++fs
gcc 7.2 supports C++17 experimental filesystem
namespace only. I do not know, maybe gcc 7.3 supports std filesystem
namespace already.
Solution 2:
You can also sudo apt install g++-8
and use #include <filesystem>
as cppreference described instead of #include <experimental/filesystem>
in older g++ and libstdc++ version.
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.
I notice that a libstdc++-8-dev
is installed along with g++-8
.
This works for me:
g++-8 -g -Wall -std=c++17 test.cpp -lstdc++fs
It seems that even with g++-8, the filesystem library is not automatically linked, you still need to provide -lstdc++fs
, and -std=c++17
is also needed in language level.
Solution 3:
Following worked for me:
In code:
#include <filesystem>
namespace filesystem = std::filesystem;
In CMakeLists:
set (CMAKE_CXX_FLAGS "-lstdc++fs -std=c++17")
On Ubuntu 18.04 with GCC 10.