c++ - 如何强制INTERFACE库上的依赖项使用C++ 11或更高版本?

标签 c++ cmake build-definition build-dependencies header-only

我正在将我的库拆分为仅 header 的库和已编译的库,因此,我第一次尝试使用CMake来“构建”或公开仅 header 的库图书馆。
阅读this和CMake文档,我了解我需要使用没有源的INTERFACE库。但是-我的 header 必须使用至少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)
但这是:
  • 并不是我只使用 header 库提供的代码-我需要说“至少C++ 11”。
  • 不能在INTERFACE库上使用。

  • 我注意到没有set_property(... INTERFACE)。那么我该如何支持强制依赖代码使用C++ 11或更高版本?
    编辑:我既对约束依赖项中确切的C++版本选择的回答感兴趣,又对约束“至少”(如果后者有问题/困难/不可能)的回答都感兴趣。

    最佳答案

    如果您的cmake版本比较新,可以尝试

    target_compile_features(foo INTERFACE cxx_std_11)
    
    这样可以确保每个使用foo的库,即
    target_link_libraries(bar PRIVATE foo)
    
    将使用C++ 11进行编译。例如,如果bar使用源文件bar.cpp,则cmake将使用std = c++ 11编译bar.cpp。

    关于c++ - 如何强制INTERFACE库上的依赖项使用C++ 11或更高版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62634268/

    相关文章:

    c++ - 无法使用 loadxml 加载 '@' 符号

    c++ - 使用旋转矩阵旋转立方体的顶点

    cmake - 如何控制 CMake 中头文件的位置?

    c++ - 可以在linux程序中使用带有msvc的在windows上构建的lib

    visual-studio - 从文本文件更新 TFS 构建定义

    tfs - 如何在项目之间移动 TFS 2010 构建定义?

    c++ - clang 似乎没有链接到库

    C++ 用静态内联声明模板函数有意义吗?

    macos - 无法在 Macbook Pro M1 2020 上安装 LightGBM,它似乎无法识别 Cmake

    gradle - Gradle 会自动推断任务之间的依赖关系吗?如果是的话,什么时候?