std :: эксперимент :: файловая система :: perm_options не был объявлен - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь работать с правами доступа к файлам в экспериментальной :: файловой системе, но в нем говорится, что perm_options не объявлено.Я попытался установить флаги lstdc++fs, а также std=c++14 и std=c++17, но безрезультатно.Я скопировал тестовый код со ссылочного сайта, и он тоже не компилируется.Тестовый код следующий:

#include <fstream>
#include <bitset>
#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

void demo_perms(fs::perms p)
{
    std::cout << ((p & fs::perms::owner_read) != fs::perms::none ? "r" : "-")
              << ((p & fs::perms::owner_write) != fs::perms::none ? "w" : "-")
              << ((p & fs::perms::owner_exec) != fs::perms::none ? "x" : "-")
              << ((p & fs::perms::group_read) != fs::perms::none ? "r" : "-")
              << ((p & fs::perms::group_write) != fs::perms::none ? "w" : "-")
              << ((p & fs::perms::group_exec) != fs::perms::none ? "x" : "-")
              << ((p & fs::perms::others_read) != fs::perms::none ? "r" : "-")
              << ((p & fs::perms::others_write) != fs::perms::none ? "w" : "-")
              << ((p & fs::perms::others_exec) != fs::perms::none ? "x" : "-")
              << '\n';
}
int main()
{
    std::ofstream("test.txt"); // create file

    std::cout << "Created file with permissions: ";
    demo_perms(fs::status("test.txt").permissions());

    fs::permissions("test.txt",
                    fs::perms::owner_all | fs::perms::group_all,
                    fs::perm_options::add);

    std::cout << "After adding o+rwx and g+rwx:  ";
    demo_perms(fs::status("test.txt").permissions());

    fs::remove("test.txt");
}

Я на Ubuntu 18.04.1 LTS использую g ++ 7.3.0.

При компиляции я получаю ошибку:

test.cpp: In function ‘int main()’:
test.cpp:72:26: error: ‘fs::perm_options’ has not been declared
                  fs::perm_options::add);

Я не уверен, что std :: эксперимент :: файловая система просто не поддерживает эту функцию, но кажется странным, что эта часть отсутствует.Буду признателен за любую помощь или направление в этом вопросе.

РЕДАКТИРОВАТЬ:

Хорошо, поэтому я не знал о g ++ 8, как Ubuntu сказал мне, чтомой g ++ был в курсе.Я установил g ++ 8.2.0 с помощью команды sudo apt-get install g++-8 и, похоже, смог использовать ее с командой g++-8 вместо g++.Я протестировал этот компилятор со стандартным cout, чтобы убедиться, что он компилируется.Я заменил include и пространство имен на это:

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

Сначала он сказал, что filesystem не определен, но я смог позаботиться об этом с флагом -std=c++17, а также добавил флаг -lstdc++fs но сейчас я получаю ошибки:

g++-8 -std=c++17 -lstdc++fs test.cpp -o test
/tmp/ccs3Eg7a.o: In function `main':
test.cpp:(.text+0x259): undefined reference to 
`std::filesystem::status(std::filesystem::__cxx11::path const&)'
test.cpp:(.text+0x2c7): undefined reference to 
`std::filesystem::permissions(std::filesystem::__cxx11::path const&, 
std::filesystem::perms, std::filesystem::perm_options)'
test.cpp:(.text+0x313): undefined reference to 
`std::filesystem::status(std::filesystem::__cxx11::path const&)'
test.cpp:(.text+0x369): undefined reference to 
`std::filesystem::remove(std::filesystem::__cxx11::path const&)'
/tmp/ccs3Eg7a.o: In function `std::filesystem::__cxx11::path::path<char [9], std::filesystem::__cxx11::path>(char const (&) [9], std::filesystem::__cxx11::path::format)':
test.cpp:(.text._ZNSt10filesystem7__cxx114pathC2IA9_cS1_EERKT_NS1_6formatE[_ZNSt10filesystem7__cxx114pathC5IA9_cS1_EERKT_NS1_6formatE]+0x6d): undefined reference to `std::filesystem::__cxx11::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status

1 Ответ

0 голосов
/ 24 января 2019

Перегрузка filesystem::permissions, которую вы пытаетесь вызвать, не существует в экспериментальной ветке.В соответствии с этим единственными перегрузками являются

void permissions(const path& p, perms prms);
void permissions(const path& p, perms prms, error_code& ec);

и filesystem::perm_options даже не type - это техническая спецификация .

C ++ 17's std::filesystem имеет std::filesystem::perm_options и filesystem::permissions перегружен, чтобы принять std::filesystem::perm_options.

Вы можете видеть, как он работает в этом живой пример на wandbox с GCC 8.1 (не поддерживается в 7.3).Обратите внимание, что вы должны использовать -lstdc++fs в настройках компилятора, чтобы он работал, так как он не связывается по умолчанию.

...