【发布时间】:2018-03-19 03:54:00
【问题描述】:
使用 GCC 4.4.7 编译主机范围 (http://www.maier-komor.de/hostscope.html) 时出现错误
操作系统:
[xtrnaw7@centos69 hostscope-V2.1]$ uname -a
Linux centos69 2.6.32-696.13.2.el6.x86_64 #1 SMP Thu Oct 5 21:22:16 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
使用的 GCC 版本:
gcc (GCC) 4.4.7 20120313(红帽 4.4.7-18)
[xtrnaw7@centos69 hostscope-V2.1]$ make
g++ -MM -g -Wall -DWFC -DVERSION=\"V2.1\" linuxdisk.cc > build/linuxdisk.d
g++ -g -O2 -Wall -DWFC -DVERSION=\"V2.1\" -c linuxdisk.cc -o build/linuxdisk.o
linuxdisk.cc: In function ‘void read_diskinfo(HostScope*)’:
linuxdisk.cc:187: error: expected ‘)’ before ‘SCNu64’
linuxdisk.cc:199: warning: spurious trailing ‘%’ in format
linuxdisk.cc:199: warning: too many arguments for format
make: *** [build/linuxdisk.o] Error 1
[xtrnaw7@centos69 hostscope-V2.1]$
gcc 抱怨的那一行是
182 uint64_t ts = get_us_time();
183 char *at = buf;
184 for (;at && *at;) {
185 uint64_t nrd, nmrd, nsecrd, msrd, nwr, nmwr, nsecwr, mswr, niop, msio, wmsio;
186 char dev[32];
187 int f = sscanf(at,"%*u %*u %31s %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 ""
188 , dev
189 , &nrd
190 , &nmrd
191 , &nsecrd
192 , &msrd
193 , &nwr
194 , &nmwr
195 , &nsecwr
196 , &mswr
197 , &niop
198 , &msio
199 , &wmsio);
200 if (f == 0)
201 return;
202 at = strchr(at,'\n');
此源文件中的包含是
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
而 SCNu64 是在 inttypes.h 中定义的
[xtrnaw7@centos69 hostscope-V2.1]$ grep SCNu64 /usr/include/inttypes.h
# define SCNu64 __PRI64_PREFIX "u"
主机范围与其他 GCC 版本一起编译时不会出错,例如
gcc (GCC) 6.4.1 20170727(红帽 6.4.1-1)
gcc (GCC) 4.8.5 20150623(红帽 4.8.5-16)
gcc (GCC) 5.3.1 20160406(红帽 5.3.1-6)
但不适用于 GCC 4.4.7
有什么线索吗?
【问题讨论】:
-
非常类似于stackoverflow.com/questions/8132399/…。尝试定义 __STDC_FORMAT_MACROS 或将
-D__STDC_FORMAT_MACROS添加到 Makefile 中的 g++ 标志。
标签: gcc