我正在编写一个使用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作为构建系统
答案 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如果有人要引用的提交。