Библиотека файловой системы ma c c ++ не распознается - PullRequest
1 голос
/ 16 июня 2020

ПРИМЕЧАНИЕ: это обязательно для #include <filesystem>. После этого происходит сбой.

Я использую macOS 10.15, использую clang 11. Вывод clang --version:

Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Когда я пытаюсь скомпилировать что-то простое, например:

#include <filesystem>

using namespace std;

filesystem::path dev_dir;

int main() {
    dev_dir = "/dev/";
    return 0;
}

Компилятор действительно находит библиотеку файловой системы, но не распознает пространство имен:

$clang trigger_controller.cpp -o trigger_controller

trigger_controller.cpp:##:##: error: use of undeclared identifier 'filesystem'
filesystem::path dev_dir;

Это файл, который я считаю m пытается включить (который, как я подтвердил, существует):

// /usr/local/include/c++/9.2.0/filesystem

#ifndef _GLIBCXX_FILESYSTEM
#define _GLIBCXX_FILESYSTEM 1

#pragma GCC system_header

#if __cplusplus >= 201703L

#include <bits/fs_fwd.h>
#include <bits/fs_path.h>
#include <bits/fs_dir.h>
#include <bits/fs_ops.h>

#define __cpp_lib_filesystem 201703

#endif // C++17

#endif // _GLIBCXX_FILESYSTEM

Что я делаю не так? Нужны ли мне специальные параметры компилятора c? Неправильное пространство имен?

1 Ответ

1 голос
/ 16 июня 2020

Да, вам нужны специальные c параметры компилятора. Обратите внимание, что все содержимое этого заголовка, за исключением шаблона, заключено в блок #if __cplusplus >= 201703L ... #endif. Это означает, что заголовок фактически пуст, если компилятор не заявляет о соответствии версии 2017 года стандарта C ++ (или более поздней).

Для clang и g cc уровень соответствия стандартам контролируется с помощью параметра командной строки -std. Документация G CC для этой опции: , здесь ; Я не знаю, где найти документацию clang, но clang обычно пытается быть совместимой с командной строкой с g cc, поэтому должны работать те же параметры.

В этом случае точный вариант, который вы должны использовать составляет -std=gnu++17 для C ++ 2017. На момент написания этой статьи поддержка новых версий стандарта C ++ все еще является «экспериментальной» и «почти наверняка будет меняться несовместимым образом», поэтому я бы избегал этого. Я также рекомендую вам избегать гиперконформного варианта этого режима, -std=c++17, потому что он имеет хороший шанс выявить ошибки в системных заголовках MacOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...