Невозможно использовать элементы <filesystem> в C++17 (GCC-7)

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

4 ответа

Решение

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

Для меня сработало следующее:

В коде:

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

В CMakeLists:

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

В Ubuntu 18.04 с GCC 10.

Одна еще не упомянутая важная вещь, которая ускользала от меня в течение нескольких часов, находилась в файле CMakeLists.txt по умолчанию:

target_compile_features(compare_files PUBLIC cxx_std_11)
вместо этого должен быть:
target_compile_features(compare_files PUBLIC cxx_std_17)

Другие вопросы по тегам