std :: filesystem и std :: эксперимент :: проблема с файловой системой в разных компиляторах - PullRequest
0 голосов
/ 21 апреля 2019

Я пишу библиотеку (только для обучения), которая использует std :: filesystem. Он отлично работает на MSVC, однако по умолчанию LTS-релизы Linux, такие как Ubuntu, поставляются с GCC 6.x и clang в официальном репозитории 3.8, у которого нет std :: filesystem, вместо этого я должен использовать std :: эксперимент :: filesystem. Как я могу обойти эту проблему, чтобы я мог поддерживать GCC 6, GCC 8+ (где работает std :: filesystem), Clang 3.8, последние версии Clang и MSVC? Я использую CMAKE в качестве системы сборки

Ответы [ 3 ]

1 голос
/ 21 апреля 2019

Условная компиляция может помочь:

#if(defined(_MSC_VER) or (defined(__GNUC__) and (7 <= __GNUC_MAJOR__)))
using n_fs = ::std::filesystem;
#else
using n_fs = ::std::experimental::filesystem;    
#endif
0 голосов
/ 21 апреля 2019

Я исправил свою проблему следующим образом:

Я добавил следующую группу кода в файл CMakeLists.txt проекта

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.4)
        message(FATAL_ERROR "You are on an extremely old version of GCC. Please update your compiler to at least GCC 5.4, preferably latest")
    elseif (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0)
        message(WARNING "Old Verison of GCC detected. Using Legacy C++ support")
        target_link_libraries(${PROJECT_NAME} -lstdc++fs)
        target_compile_definitions(${PROJECT_NAME} PUBLIC LEGACY_CXX)
    endif()
endif()

И в моем файле CPP я сделал это:

#ifdef LEGACY_CXX
#include <experimental/filesystem>
namespace n_fs = ::std::experimental::filesystem;
#else
#include <filesystem>
namespace n_fs = ::std::filesystem;
#endif

Вот коммит, если кто-то захочет сослаться на него.

0 голосов
/ 21 апреля 2019

«Как мне обойти эту проблему» - установив новый компилятор / стандартную библиотеку.Или не используя std::filesystem.

Например, в RedHat и CentOS вы можете установить devtoolset-8 , чтобы получить доступ к более новому (и поддерживаемому) компилятору, чем в базовой системе,Другие дистрибутивы Linux могут имеют аналогичные параметры.

Вы также можете скомпилировать более новый компилятор + std lib из исходного кода.Само по себе это не так уж сложно, но вы должны быть осторожны, чтобы затем отправлять новые библиотеки.А тестирование совместимости с базовыми библиотеками дистрибутивов и т. Д. на вас .

Вы также можете, согласно ответу @ VTT, использовать условную компиляцию для возврата к std::experimental::filesystem, если это весь ваш набор инструментовподдерживает, и вы в порядке с этим.

Если вы не хотите менять компилятор, и использование std::experimental::filesystem не подходит (или ваш компилятор / стандартная библиотека даже не поддерживает это), тогда ваш единственный вариантиспользовать собственные функции ОС.

...