微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在OSX上检测<filesystem>可用性?

如何解决如何在OSX上检测<filesystem>可用性?

我想做一些跨平台的std::filesystem的可选用法,并使用如下代码

#ifdef __has_include
#if __has_include(<version>)
#include <version>
#endif
#endif

#ifdef __cpp_lib_filesystem
#include <filesystem>
// Use of std::filesystem::path
#endif

然后,我可以通过-std=c++11-std=c++17并且拥有或不具有对文件系统的支持

这几乎可以在任何地方都可以正常工作,但是在没有设置显式目标平台级别的最新OSX上也可以。这似乎认为某些较旧的OSX并引发编译错误

错误:“路径”不可用:macOS 10.15中引入的
...
Applications / Xcode_11.3.1.app / Contents / Developer / Toolchains / XcodeDefault.xctoolchain / usr / bin /../ include / c ++ / v1 / filesystem:739:24:
注意:“路径”已在此处明确标记为不可用

那么我应该如何在OSX上处理此问题而不依赖于configure校验(如果这样的代码可以编译)?功能检测宏__cpp_lib_filesystem是否意味着不需要进行此类配置步骤?

解决方法

问题是您设置要支持的OSX版本。

在OSX / MacOS C ++标准库中是系统的一部分。因此,如果您设置程序支持某些版本的MacOS编译器,则会检查该版本的系统是否具有支持特定功能的标准C ++库。

例如,启用C ++ 17并不重要,但是如果您的程序应该支持OSX 10.13,则该程序将无法编译:

int foo(std::optional<int> x)
{
   return x.value();
}

因为这可能引发异常:std::bad_optional_access是操作系统随附的标准库动态库的一部分。

另一方面,此代码可以正常编译:

int foo(std::optional<int> x)
{
   return x.value_or(0);
}

因为此版本不会抛出,并且仅在可执行文件中生成模板代码。

文件系统功能存在完全相同的问题。因此,编译器抱怨您需要设置项目以支持MacOS 10.15或更高版本。

如果您使用的是cmake,请将其添加到根CMakeLists.txt

# note this entry must be set before any target or project is created
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")

如果您正在使用Xcode项目: enter image description here

有一种方法可以检测平台并使此10.15功能可用。 这是SO answer describing how to do it。 这样,您可以拥有仅在所需的OS版本上运行时才具有某些功能的应用程序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。