代码之家  ›  专栏  ›  技术社区  ›  Steve314

如何在cmake中为不同的编译器应用不同的编译器选项?

  •  24
  • Steve314  · 技术社区  · 14 年前

    我目前正在使用CMASE构建一些项目,主要平台是Visual C++、MINW 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
    

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

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

    在这种情况下,我希望能够在CMakeLists.txt文件中直接测试gcc。不过,到目前为止,我还没有找到一个合适的变量来测试,也没有任何其他明显的解决方案。

    这可能吗?

    1 回复  |  直到 14 年前
        1
  •  37
  •   richq luc    14 年前

    要创建一个可移植的构建系统,最好不要测试平台,而是测试特性。

    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++,有一个类似的CabcXxCuffILILL标志 check_cxx_compiler_flag(flag var) 命令。