如何强制依赖于我的 INTERFACE 库的对象使用 C++11 或更高版本?

How do I force dependents on my INTERFACE library to use C++11 or later?

我正在将我的一个库拆分为一个 header-only 库和一个已编译的库,所以,这是我第一次尝试使用 CMake 来“构建”,或者而是公开一个 header-only 库。

阅读 this 和 CMake 文档,我知道我需要使用没有源代码的 INTERFACE 库。但是 - 我的 headers 必须使用至少 C++11 的 C++ 语言标准版本进行编译。当我实际编译一些东西时,我做了:

set_property(TARGET foo PROPERTY CXX_STANDARD 11)
set_property(TARGET foo PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET foo PROPERTY CXX_EXTENSIONS OFF)

但那是:

  1. 使用 header-only 库的代码不完全是我需要的 - 我需要说“至少 C++11”。
  2. 不能用于 INTERFACE 库。

我注意到没有 set_property(... INTERFACE)。那么我应该如何强制依赖代码使用 C++11-or-later?

编辑: 我对约束 exact C++ 版本选择以及“至少”约束的答案都很感兴趣- 如果后者是 problematic/difficult/impossible.

如果你有相当新版本的cmake,你可以试试

target_compile_features(foo INTERFACE cxx_std_11)

这确保每个使用 foo 的库,即

target_link_libraries(bar PRIVATE foo)

将使用 C++11 编译。例如,如果 bar 使用源文件 bar.cpp,那么 bar.cpp 将使用 std= 编译c++11 由 cmake.