Ошибки связи с использованием & lt; файловой системы & gt; члены в C ++ 17

Я использую 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? Заранее спасибо.

10

Решение

Добавьте флаг -lstdc++fs:

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

gcc 7.2 поддерживает C ++ 17 экспериментальный filesystem только пространство имен. Не знаю, может gcc 7.3 поддерживает std filesystem пространство имен уже

8

Другие решения

Вы также можете 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 также необходим на уровне языка.

1

По вопросам рекламы [email protected]