问题描述
我想使用一些在旧的GCC版本中不可用的GCC警告开关(例如-Wtype-limits)。
有没有一个简单的方法来检查GCC版本?
最佳解决方案
我不会说容易,但是可以使用GNU make的SHELL函数来执行gcc --version命令,然后使用ifeq条件表达式来检查版本号,并适当地设置CFLAGS变量。
以下是一个简单的MakeFile示例:
		
		
			
			
			
			
				
					
				|  | CC = gcc GCCVERSION = $(shell gcc --version | grep ^gcc | sed 's/^.* //g') CFLAGS = -g   ifeq "$(GCCVERSION)" "4.4.3"     CFLAGS += -Wtype-limits endif   all:         $(CC) $(CFLAGS) prog.c -o prog | 
				
			 
		 
注意:不存在ifgt语法。但是可以使用expr命令进行比较。
例子如下:
		
		
			
			
			
			
				
					
				|  | CC = gcc GCCVERSIONGTEQ4 := $(shell expr `gcc -dumpversion | cut -f1 -d.` \>= 4) CFLAGS = -g   ifeq "$(GCCVERSIONGTEQ4)" "1"     CFLAGS += -Wtype-limits endif   all:         $(CC) $(CFLAGS) prog.c -o prog | 
				
			 
		 
次佳解决方案
要将完整的3部分GCC版本(不仅第一位数字)转换成数字格式,适合比较(例如40701)使用
		
		
			
			
			
			
				
					
				|  | gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$/&00/' | 
				
			 
		 
其中解决了任何版本部分中双数字版本号的可能性,以及gcc -dumpversion输出内容缺少3个部分的可能性(在一些较早的GCC版本中存在这种情况)。
所以要测试MakeFile中的版本,使用(注意$$里面的最后一个sed命令)
		
		
			
			
			
			
				
					
				|  | GCC_GTEQ_472 := $(shell expr `gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/'` \>= 40702) ifeq "$(GCC_GTEQ_472)" "1"   ... endif | 
				
			 
		 
第三种解决方案
我刚刚遇到这个问题,我需要测试GCC的前两位数字,想要一个比上面sed过滤字符串更复杂的操作。我使用bc进行比较,因为它支持浮点数(expr将非整数(non-integers)都视为字符串):
		
		
			
			
			
			
				
					
				|  | GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | bc ) ifeq ($(GCC_VER_GTE44),1) ... endif | 
				
			 
		 
如果在GCC 4.9之后发布了GCC 4.10,那么用sed处理是必要的:
		
		
			
			
			
			
				
					
				|  | GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | sed -e 's/\./*100+/g' | bc ) ifeq ($(GCC_VER_GTE44),1) ... endif | 
				
			 
		 
参考链接
在Makefile中检查gcc版本?