本文主要是介绍cmake:获取GUN编译器的版本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 -dumpversionOUTPUT_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的错误。如下图:
- cmake:使用execute_process调用shell命令或脚本
这篇关于cmake:获取GUN编译器的版本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!