【问题标题】:How to apply different compiler options for different compilers in cmake?如何在 cmake 中为不同的编译器应用不同的编译器选项?
【发布时间】:2011-03-09 06:12:54
【问题描述】:

我目前正在使用 cmake 构建一些项目,主要平台是 Visual C++、MinGW GCC 和 Linux GCC。使用 GCC 构建时,我需要指定 -Wno-invalid-offsetof 编译器选项。

我目前的修复如下...

if (   "${CMAKE_GENERATOR}" MATCHES "^Visual Studio"
    OR "${CMAKE_GENERATOR}" MATCHES "^NMake"
   )
    set (CPPLIB_COMPILER_OPTS "")
else ()
    set (CPPLIB_COMPILER_OPTS "-Wno-invalid-offsetof")
endif ()

...

set_target_properties(sh_core PROPERTIES COMPILE_FLAGS "${CPPLIB_COMPILER_OPTS}")
# repeated for all targets

这是可行的,但假设除 Visual Studio 之外的所有生成器都将使用 gcc 构建显然是不安全的。首先,有用于 Borland 编译器的 IIRC 生成器。更重要的是,使用 make 并不总是意味着使用 gcc。

我可能使用的其他编译器是 llvm-gcc 和 clang。幸运的是,我认为即使 clang 也支持 gcc 兼容选项。但是这个逻辑只有在相关代码不发布的情况下才有用。

Cmake 似乎会检查可用的编译器并专门为该编译器生成一个 makefile(提出一个问题 - 为什么不至少可以选择直接构建项目,而不需要像 make 这样的中间人?)。

既然如此,我希望能够在我的 CMakeLists.txt 文件中直接测试 gcc。不过,到目前为止,我找不到合适的变量来测试或任何其他明显的解决方案。

这可能吗?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    要创建可移植的构建系统,最好不要测试平台,而是测试功能。

    不要测试“如果 Windows 则执行此操作”,而是测试“如果 -Wno-invalid-offsetof 标志有效,然后使用它”。您可以使用 CheckCCompilerFlag 模块来做到这一点,例如:

    include(CheckCCompilerFlag)
    check_c_compiler_flag(-Wno-invalid-offsetof HAS_NO_INVALID_OFFSETOF)
    if (HAS_NO_INVALID_OFFSETOF)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-invalid-offsetof")
    endif()
    

    对于 C++,有一个类似的带有 check_cxx_compiler_flag(flag var) 命令的 CheckCXXCompilerFlag。

    【讨论】:

    • 太完美了!不过,一件无关紧要的事情……检查 C 的选项没有多大意义,因为在 C 中没有无效的 offsetof 之类的东西 - 它只发生在 C++ 中。
    • 我不知道。事实上,我不知道该选项的用途,但它非常有意义,因为 C 只有 POD 类型 gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html。并且 CMake 在其测试期间忽略编译器警告 - “如果它编译它工作”。
    • 有没有办法检查选项组合?此外,我想确保没有编译时警告,因此也在寻找一种方法来调查警告。
    • 请注意,gcc 不会对不存在的Wno-* 选项发出警告(或错误),因此对于 gcc,检查将始终成功。
    猜你喜欢
    • 2017-11-21
    • 1970-01-01
    • 2021-12-10
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2021-09-01
    相关资源
    最近更新 更多