Поддерживает ли llvm 9 std :: filesystem в версиях Mac до 10.15? - PullRequest
1 голос
/ 31 октября 2019

У меня есть старый Mac (около 2009 года) под управлением El Capitan версии 10.11.6. Apple не разрешает дальнейшие обновления своей ОС на моем компьютере, но через Macports она служит прекрасной средой разработки для не-специфичного для Apple программного обеспечения.

Я компилирую с g ++ 9.2, который поддерживает std :: filesystem из коробки, и с clang 8.0, который не поддерживает. (В каждом случае используется собственная стандартная библиотека каждого компилятора.) И я компилирую с --std = c ++ 2a.

Я заметил, что llvm 9 должен поддерживать std :: filesystem outкоробки (https://libcxx.llvm.org/docs/UsingLibcxx.html#using-filesystem),, поэтому я загрузил clang / llvm 9 через Macports. К сожалению, я попал в ловушку.

Минимальный код для воспроизведения ошибки - упрощение примера из cppreference.com(https://en.cppreference.com/w/cpp/filesystem/path/path)

#include <filesystem>
#include <iostream>

namespace fs = std::filesystem;

int
main()
{
   fs::path p1 = "/usr/lib/sendmail.cf";

   std::cout << "p1 = " << p1 << '\n';
}

А вот CmakeLists.txt

cmake_minimum_required(VERSION 3.15.5)
project(bug LANGUAGES CXX)
add_executable (bug main.cpp)
target_compile_options(bug PRIVATE "-std=c++2a")

А вот жалобы компилятора:

[build] Starting build
[proc] Executing command: /opt/local/bin/cmake --build ~/temp/build/debug/clang --config debug --target all -- -j 10
[build] [1/2  50% :: 1.598] Building CXX object CMakeFiles/bug.dir/main.cpp.o
[build] FAILED: CMakeFiles/bug.dir/main.cpp.o 
[build] /opt/local/bin/clang++    -g   -std=c++2a -MD -MT CMakeFiles/bug.dir/main.cpp.o -MF CMakeFiles/bug.dir/main.cpp.o.d -o CMakeFiles/bug.dir/main.cpp.o -c ../../../main.cpp
[build] ../../../main.cpp:9:8: error: 'path' is unavailable: introduced in macOS 10.15
[build]    fs::path p1 = "/usr/lib/sendmail.cf";
[build]        ^
[build] /opt/local/libexec/llvm-9.0/bin/../include/c++/v1/filesystem:738:24: note: 'path' has been explicitly marked unavailable here
[build] class _LIBCPP_TYPE_VIS path {
...

Работая в обратном направлении, я нахожу этот биткода в /opt/local/libexec/llvm-9.0/include/c++/v1/__config:

#  define _LIBCPP_AVAILABILITY_FILESYSTEM                                      \
     __attribute__((availability(macosx,strict,introduced=10.15)))             \
     __attribute__((availability(ios,strict,introduced=13.0)))                 \
     __attribute__((availability(tvos,strict,introduced=13.0)))                \
     __attribute__((availability(watchos,strict,introduced=6.0)))

Насколько я могу определить, этот #define является основной причиной вышеприведенного сообщения об ошибке.

Итак, мои вопросы:

  • Это ошибка в LLVM? В конце концов, GCC не вводит зависимость между std :: filesystem и версией ОС.
  • Это ошибка в Macports? Может быть, они не использовали правильные флаги при сборке?
  • Если бы я собирался собрать LLVM и Clang изначально, могу ли я обойти эту проблему?
  • Это проблема вообще? Может быть, хорошие люди из LLVM знают то, чего не знают хорошие люди из GCC.

ПРИМЕЧАНИЕ. Аналогичный вопрос касается clang / llvm, загруженного с помощью Homebrew. К сожалению, комментарий не помог. [LLVM-9 clang-9 OSX]: std :: filesystem :: path нераспознан

...