GNU编译器(GCC)为编译器所生产系统GNU项目支持各种编程语言。GCC是GNU工具链的关键组件,也是大多数与GNU和Linux有关的项目(包括Linux内核)的标准编译器。在自由软件基金会(FSF)的分配下GCC GNU通用公共许可证(GNU GPL)。作为工具和示例,GCC在自由软件的增长中发挥了重要作用。

实践

   if (CMAKE_COMPILER_IS_GNUCC)
        execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpfullversion -dumpversion
                OUTPUT_VARIABLE GCC_VERSION)
        string(REGEX MATCHALL "[0-9]+" GCC_VERSION_COMPONENTS ${GCC_VERSION})
        list(GET GCC_VERSION_COMPONENTS 0 GCC_MAJOR)
        list(GET GCC_VERSION_COMPONENTS 1 GCC_MINOR)

        message(STATUS "cmake version=${CMAKE_VERSION}")

        set(GCC_VERSION "${GCC_MAJOR}.${GCC_MINOR}")
        message(STATUS "gcc version=${GCC_VERSION}")

        if (GCC_VERSION GREATER "4.7")
            message(STATUS "gcc version major=${GCC_MAJOR}")
            message(STATUS "gcc version minor=${GCC_MINOR}")
            add_definitions("-Wno-implicit-fallthrough")
        endif()
    endif()

在这里插入图片描述

其他

CMAKE变量:CMAKE_COMPILER_IS_GNUCC

如果C编译器是 GNU,则为真。

-Wno-implicit-fallthrough

查看gcc版本:

gcc -dumpversion

如果gcc版本号为7,那么源代码的switch-case块中如果忘了加上break,有可能会报错Implicit fallthrough error。解决方法有几种,比如:

  • 更换gcc版本,具体是升级还是降级还需测试。
  • 在报错的switch-case块中加上break。此时要对代码逻辑理解清楚,否则加上break有可能会破坏原来的逻辑。
  • 编译时忽略Implicit fallthrough error这个错误。

笔者采用了第三种方法,即在编译的时候就忽略这个错误。方法是修改objs/Makefile的内容。
下载nginx的源代码并解压缩后,进入nginx目录。此时当前目录下没有Makefile,也没有objs文件夹。执行./configure命令将在当前目录生成Makefile,并且生成objs文件夹,objs文件夹下面也有一个Makefile。当前文件夹下的Makefile主要调用objs/Makefile去执行编译命令。
因此为了解决编译的报错(或报警),需要增加objs/Makefile的编译参数。用vim编辑该文件,看到头几行内容为:
在这里插入图片描述
CFLAGS表示编译的可选参数,我们只需要在后面加上**-Wno-implicit-fallthrough**,即可忽略gcc7编译时switch-case中缺少break的错误。如下图:
在这里插入图片描述

Logo

更多推荐