不同编译器中的std :: filesystem和std :: experimental :: filesystem问题

时间:2019-04-21 12:53:42

标签: c++ c++11 visual-c++ cmake c++14

我正在编写一个使用std :: filesystem的库(仅供学习)。它可以在MSVC上正常工作,但是默认情况下,Linux的LTS发行版(例如Ubuntu附带GCC 6.x)和官方存储库中的clang是3.8,它没有std :: filesystem,而是必须使用std :: experimental :: filesystem。我如何解决此问题,以便可以支持GCC 6,GCC 8+(其中std :: filesystem工作),Clang 3.8,最新的Clang和MSVC? 我正在使用CMAKE作为构建系统

3 个答案:

答案 0 :(得分:1)

有条件的编译可能会有所帮助:

#if(defined(_MSC_VER) or (defined(__GNUC__) and (7 <= __GNUC_MAJOR__)))
using n_fs = ::std::filesystem;
#else
using n_fs = ::std::experimental::filesystem;    
#endif

答案 1 :(得分:0)

“如何解决此问题”-通过安装较新的编译器/标准库。或者不使用std::filesystem

例如,在RedHat和CentOS上,您可以安装devtoolset-8来访问比基本系统提供的更新(受支持)的编译器。其他Linux发行版 可能具有类似的选项。

您还可以从源代码自己编译更新的编译器+ std lib。本身并不太困难,但是您还需要小心,然后再交付新库。 即可测试与基本发行版库等的兼容性。

根据@VTT的回答,如果您的工具链支持的所有内容都可以,那么您也可以使用条件编译回退到std::experimental::filesystem

您不想更改编译器,并且不能使用std::experimental::filesystem(或者您的编译器/标准库甚至不支持该编译器),那么您唯一的选择是使用OS本机功能。

答案 2 :(得分:0)

我通过以下方式解决了问题:

我在项目的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

Here's如果有人要引用的提交。