Я использую gcc 7.2 в Ubuntu 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>
вместо просто <filesystem>
в С ++ 17? Заранее спасибо.
Добавьте флаг -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>
как описано выше вместо #include <experimental/filesystem>
в более старых версиях g ++ и libstdc ++.
Если я установлю gcc 8 в Ubuntu, будут ли у меня две разные библиотеки libstdc ++ или просто будет обновлена оригинальная?
у вас, вероятно, будет два, даже если новый будет работать как замена старого.
Я заметил, что libstdc++-8-dev
устанавливается вместе с g++-8
,
Это работает для меня:
g++-8 -g -Wall -std=c++17 test.cpp -lstdc++fs
Кажется, что даже с g ++ — 8 библиотека файловой системы не связана автоматически, вам все равно нужно предоставить -lstdc++fs
, а также -std=c++17
также необходим на уровне языка.