GCC常见错误解析

合集下载

gcc_missing_field_initializers_概述说明

gcc_missing_field_initializers_概述说明

gcc missing field initializers 概述说明1. 引言1.1 概述在软件开发中,编译器的报错信息往往是我们解决问题的关键线索之一。

而当我们使用gcc编译器时,有时会遇到"missing field initializers"错误。

这种错误通常与结构体或类中缺少字段初始化器有关,即某些字段没有被正确地初始化。

本文就将围绕这个问题展开讨论,并提供相应的解决方法和实践指南。

1.2 文章结构本文将按照以下结构展开论述:- 引言:对文章主题进行概述说明以及文章结构介绍。

- 缺少字段初始化器问题:详细描述该问题的出现情境、原因分析以及解决方法。

- 影响与应用场景:探讨缺少字段初始化器问题可能带来的影响范围和适用场景,并提供相关注意事项。

- 示例与实践指南:通过示例代码解析来深入理解该问题,并给出实践指南和常见错误与解决方案。

- 结论:对全文进行总结,并提出心得及建议。

1.3 目的本文旨在帮助读者了解gcc编译器中"missing field initializers"错误的产生原因和解决方法,使读者能够正确地处理这一类型的编译错误。

通过本文的阅读,读者可以掌握如何查找并修复相关问题,并在实践中避免这类错误的发生。

以上就是文章“1. 引言”部分的详细内容。

2. 缺少字段初始化器问题:2.1 问题描述:缺少字段初始化器问题是一个在使用gcc编译器时经常遇到的错误。

这个错误通常指示在代码中存在未被正确初始化的结构体或对象的字段。

2.2 原因分析:缺少字段初始化器问题通常发生在以下情况下:- 在定义结构体或对象时,没有为所有字段提供初始化值。

- 初始化值的类型与字段的类型不匹配。

- 在给定的上下文中,某些特定字段必须进行初始化,但其被忽略了。

这些原因可能导致程序运行时出现未定义的行为、内存泄漏或其他意外结果。

2.3 解决方法:要解决缺少字段初始化器问题,可以采取以下步骤:- 确保为每个结构体或对象的字段提供适当的初始化值。

关于gcc中遇到的问题,这里有你想要的全部答案

关于gcc中遇到的问题,这里有你想要的全部答案

关于gcc中遇到的问题,这里有你想要的全部答案前言什么是 gcc[gcc 官方网站](/)GCC(GNU Compiler Collection,GNU编译器套件),是由GNU 开发的编程语言编译器。

它是以GPL(General Public License)许可证所发行的自由软件,也是GNU 计划的关键部分(GPU 是一个软件工程项目,是 GNU's Not Unix 的缩写)。

GCC 原本作为GNU 操作系统的官方编译器,现已被大多数类Unix 操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC 同样适用于微软的Windows。

GCC 是自由软件过程发展中的著名例子,由自由软件基金会以 GPL 协议发布。

什么是 glibc[glibc 官方网站](/software/libc/)glibc 是 gnu 发布的 libc 库,即 c 运行库。

glibc 是 linux 系统中最底层的 api,几乎其他任何的运行库都会依赖 glibc. glibc 除了封装linux 操作系统所提供的系统服务外,它本身提供了许多其它一些必要服务的实现,主要有:•string:字符串处理•signal:信号处理•dlfcn:管理共享库的动态加载•direct:文件目录操作•elf:共享库的动态加载器,即 interpreter•iconv:不同字符集的编码转换•inet:socket 接口的实现•intl:gettext 的实现•io•linuxthreads•locale:本地化•login:虚拟终端设备的管理,及系统的安全访问•malloc:动态内存管理的分配与管理•nis•stdlib•mathgcc 和 glibc 的关系首先,gcc 是编译器,基本上 linux 下所有程序(包括内核)都是gcc 编译的,libc 也是。

但 gcc 和 libc 又是相互依赖的,什么意思呢?就是在编译 c/cpp 代码时,既需要 gcc,也需要 libc.gcc 发行版本截止2021年8月,最新版本已经到 gcc11.2 了。

gcc支付系统用户使用步骤简要和常见问题解答

gcc支付系统用户使用步骤简要和常见问题解答

GCC支付系统用户使用步骤简要和常见问题解答一、概述该系统为用户提供了丰富的支付功能和支付种类,它除了可以满足进出口企业用户在网上缴纳海关税款和行政事业性收费(以下简称海关税费)的需要,还可以方便用户向其他的口岸机构支付有关的通关费用。

同时,它还向用户提供了方便、快捷、高效的税费信息、帐单信息和报关单信息等的信息查询服务。

GCC支付系统可以支付的税费种类1、进口关税5、反倾销税9、增值税缓息13、滞纳金2、出口关税6、进口增值税 10、监管手续费 14、进口消费税3、特定关税7、关税缓息11、保证金4、特定增值税8、消费税缓息12、滞报金二、系统设备安装及环境要求●PC电脑:PII266以上,32M以上内存,有2G以上的有效空间●操作系统:Win2000、WinXp或Win98操作系统●浏览器:IE 6.0版本(最好为IE6.00.2600或IE6.00.2800)●网络:通过单位局域网、或通过调制解调器和可拨外线的电话线路连接互联网。

●其他:USB接口三、用户登陆及密码修改系统密码:系统初始密码123系统密码修改在用户登陆后,点击“修改密码”进行修改证书密码:初始密码为和卡对应的密码信封中的密码(注意大小写、数字和字母的区分)证书密码修改在用户登录页面上,点击“修改证书密码”就可按照提示输入,修改密码。

该证书密码连续输错7次,卡会被琐住,请在输入密码时,务必仔细。

若被锁,需来我们公司解锁。

四、操作步骤1. 下载驱动程序首先在网页的相关文档下载中下载IE客户端控件安装包。

然后检查系统是否已经装有错误的USB KEY驱动程序,如果有则需删除,否则就双击运行Z_Setup程序,最后再插入USB KEY(如果是98需要重新启动)。

2. 使用法人卡登录系统为操作员卡配置权限用户可以根据本企业的业务流程及实际使用需要,将修改权限与修改可操作帐号内的权限授给操作员卡。

法人卡不具备支付功能。

3. 使用操作员卡登陆进行税费单的支付根据报关单号进行支付点击进入“查询报关单”,输入报关单号码,查询到此票报关单,进行支付。

gcc常见的编译警告与错误(按字母顺序排列)

gcc常见的编译警告与错误(按字母顺序排列)

gcc 常见的编译警告与错误(按字母顺序排列)C语言初学者遇到的最大问题往往是看不懂编译错误,进而不知如何修改程序。

有鉴于此,本附录罗列了用gcc编译程序时经常出现的编译警告与错误。

需要提醒读者的是,出现警告(warning)并不影响目标程序的生成,但出现错误(error)则无法生成目标程序。

为便于读者查阅,下面列出了经常遇到的警告与错误,给出了中英文对照(英文按字典顺序排列),并对部分错误与警告做了必要的解释。

#%s expects \FILENAME\ or …#%s 需要 \FILENAME\ 或…#%s is a deprecated GCC extension#%s 是一个已过时的 GCC 扩展#%s is a GCC extension#%s 是一个 GCC 扩展#~ error:#~ 错误:#~ In file included from %s:%u#~ 在包含自 %s:%u 的文件中#~ internal error:#~ 内部错误:#~ no newline at end of file#~ 文件未以空白行结束#~ warning:#~ 警告:#elif after #else#elif 出现在 #else 后#elif without #if#elif 没有匹配的 #if#else after #else#else 出现在 #else 后#else without #if#else 没有匹配的 #if#endif without #if#endif 没有匹配的 #if#include nested too deeply#include 嵌套过深#include_next in primary source file#include_next 出现在主源文件中#pragma %s %s is already registered#pragma %s %s 已经被注册#pragma %s is already registered#pragma %s 已经被注册#pragma once in main file#pragma once 出现在主文件中#pragma system_header ignored outside include file#pragma system_heade 在包含文件外被忽略%.*s is not a valid universal character%.*s 不是一个有效的 Unicode 字符%s in preprocessing directive预处理指示中出现 %s%s is a block device%s 是一个块设备%s is shorter than expected%s 短于预期%s is too large%s 过大%s with no expression%s 后没有表达式%s: not used because `%.*s’ defined as `%s’ not `%.*s’ %s:未使用因为‘%.*s’被定义为‘%s’而非‘%*.s’%s: not used because `%.*s’ is poisoned%s:未使用因为‘%.*s’已被投毒%s: not used because `%.*s’ not def ined%s:未使用因为‘%.*s’未定义%s: not used because `%s’ is defined%s:未使用因为‘%s’已定义%s: not used because `__COUNTER__’ is invalid%s:未使用因为‘__COUNTER__’无效(\%s\ is an alternative token for \%s\ in C++)(在 C++ 中“%s”会是“%s”的替代标识符)(this will be reported only once per input file)(此警告为每个输入文件只报告一次)\%s\ after # is not a positive integer# 后的“%s”不是一个正整数\%s\ after #line is not a positive integer#line 后的“%s”不是一个正整数\%s\ cannot be used as a macro name as it is an operator in C++ “%s”不能被用作宏名,因为它是 C++ 中的一个操作符\%s\ is not a valid filename“%s”不是一个有效的文件名\%s\ is not defined“%s”未定义\%s\ may not appear in macro parameter list“%s不能出现在宏参数列表中\%s\ re-asserted重断言“%s”\%s\ redefined“%s重定义\/*\ within comment“/*出现在注释中\\x used with no following hex digits\\x 后没有 16 进制数字\defined\ cannot be used as a macro name“defined不能被用作宏名__COUNTER__ expanded inside directive with -fdirectives-only带 -fdirectives-only 时 __COUNTER__ 在指示中扩展__VA_ARGS__ can only appear in the expansion of a C99 variadic macro __VA_ARGS__ 只能出现在 C99 可变参数宏的展开中_Pragma takes a parenthesized string literal_Pragma 需要一个括起的字符串字面常量‘%.*s’ is not in NFC‘%.*s’不在 NFC 中‘%.*s’ is not in NFKC‘%.*s’不在 NFKC 中‘##’ cannot appear at either end of a macro expansion‘##’不能出现在宏展开的两端‘#’ is not followed by a macro parameter‘#’后没有宏参数‘$’ in identifier or number‘$’出现在标识符或数字中‘:’ without preceding ‘?’‘:’前没有‘?’‘?’ without following ‘:’‘?’后没有‘:’'return' with a value, in function returning void在void返回类型的函数中,return返回值。

C语言程序设计中的常见错误和解决

C语言程序设计中的常见错误和解决

C语言程序设计中的常见错误和解决在C语言程序设计中,很多初学者经常会遇到一些常见的错误。

这些错误可能是语法错误、逻辑错误或者是其他一些常见问题导致的。

本文将介绍一些经常出现的C语言程序设计错误,并提供相应的解决方法,帮助读者更好地理解和掌握C语言编程。

一、语法错误1. 括号未匹配括号未匹配是C语言中常见的语法错误之一。

在编写代码时,经常会使用到括号,如if语句、for循环等。

如果不小心忘记关闭某个括号,就会导致括号未匹配的错误。

解决方法:仔细检查代码中的括号是否匹配,并确保每个左括号都有相应的右括号。

2. 分号丢失分号丢失是C语言中另一个常见的语法错误。

在C语言中,分号用于分隔语句,如果遗漏了分号,编译器就无法识别出语句的结束。

解决方法:检查每一行语句的末尾,确保每个语句都以分号结尾。

3. 变量未声明在使用变量之前,必须先声明该变量。

如果没有先声明变量就直接使用,编译器将无法识别该变量,从而报错。

解决方法:在使用变量之前,先进行变量声明。

二、逻辑错误1. 循环控制条件错误在编写循环语句时,控制条件的错误是常见的逻辑错误。

如果循环的控制条件错误,循环可能无法正常结束或者根本无法执行。

解决方法:仔细检查循环的控制条件,确保条件符合预期,并在循环体内更新循环变量。

2. 数组越界访问在C语言中,数组的索引从0开始,通过索引访问数组元素时,如果索引超出了数组的范围,就会导致数组越界访问的错误。

解决方法:确保数组索引在正确的范围内,避免越界访问。

如果需要遍历数组,可以使用循环来控制数组的访问范围。

三、其他常见问题及解决方法1. 变量类型不匹配在赋值操作或者表达式计算时,如果不同类型的变量之间进行操作,则会导致变量类型不匹配的错误。

解决方法:确保操作的变量类型相同或者进行强制类型转换,以保证变量类型的匹配。

2. 内存泄漏在C语言中,手动分配内存的操作是常见的。

如果分配了内存空间,但在使用完毕后未及时释放,就会导致内存泄漏。

常见gcc编译警告整理以及解决方法【收藏】

常见gcc编译警告整理以及解决方法【收藏】

常见gcc编译警告整理以及解决方法【收藏】
1、warning: no newline at end of file
 在文件最后一行加上回车键
 解释:在《Rationale for the C99 standard》一文中,有C99的相关信息:
 A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines. In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing a backslash/newline sequence.
 c/c++代码的每一行后面有一个结束符,也就是newline。

避免当被include
的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。

 2、warning: comparison between pointer and integer
 解释:integer与pointer比较
 3、warning: assignment discards qualifiers from pointer target type。

常见gcc编译问题解决方法集

常见gcc编译问题解决方法集

常见gcc编译问题解决⽅法集除⾮明确说明,本⽂内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录⼀下(加粗字体是关键词):⽤“-Wl,-Bstatic”指定链接静态库,使⽤“-Wl,-Bdynamic”指定链接共享库,使⽤⽰例:-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest ("-Wl"表⽰是传递给链接器ld的参数,⽽不是编译器gcc/g++的参数。

)1) 下⾯是因为没有指定链接参数-lz(/usr/lib/libz.so,/usr/lib/libz.a )/usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_uncompress':/home/software/mysql-5.5.24/mysys/my_compress.c:122: undefined reference to `uncompress'/usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_compress_alloc':/home/software/mysql-5.5.24/mysys/my_compress.c:71: undefined reference to `compress'2) 下⾯是因为没有指定编译链接参数-pthread(注意不仅仅是-lpthraed)/usr/local/mysql/lib/mysql/libmysqlclient.a(charset.c.o): In function `get_charset_name':/home/zhangsan/mysql-5.5.24/mysys/charset.c:533: undefined reference to `pthread_once'3) 下⾯这个是因为没有指定链接参数-lrt/usr/local/thirdparty/curl/lib/libcurl.a(libcurl_la-timeval.o): In function `curlx_tvnow':timeval.c:(.text+0xe9): undefined reference to `clock_gettime'4) 下⾯这个是因为没有指定链接参数-ldl/usr/local/thirdparty/openssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':dso_dlfcn.c:(.text+0x4c): undefined reference to `dlopen'dso_dlfcn.c:(.text+0x62): undefined reference to `dlsym'dso_dlfcn.c:(.text+0x6c): undefined reference to `dlclose'5) 下⾯这个是因为指定了链接参数-static,它的存在,要求链接的必须是静态库,⽽不能是共享库ld: attempted static link of dynamic object如果是以-L加-l⽅式指定,则⽬录下必须有.a⽂件存在,否则会报-l的库⽂件找不到:ld: cannot find -lACE6) GCC编译遇到如下的错误,可能是因为在编译时没有指定-fPIC,记住:-fPIC即是编译参数,也是链接参数relocation R_x86_64_32S against `vtable for CMyClass` can not be used when making a shared object7) 下⾯的错误表⽰gcc编译时需要定义宏__STDC_FORMAT_MACROS,并且必须包含头⽂件inttypes.htest.cpp:35: error: expected `)' before 'PRIu64'8) 下⾯是因为在x86机器(32位)上编译没有指定编译参数-march=pentium4../../src/common/libmooon.a(logger.o): In function `atomic_dec_and_test':../../include/mooon/sys/atomic_gcc.h:103: undefined reference to `__sync_sub_and_fetch_4'9) 下列错误可能是因为多了个“}”error: expected declaration before '}' token10) 下列错误可能是因为少了个“}”error: expected `}' at end of input11) 下⾯这个错误是编译⼀个共享库时,该共享库依赖的⼀静态库编译时没有加“-fPIC”参数,解决⽅法为带“-fPIC”重新编译被依赖的静态库relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC12) 下⾯这个错误,是因为头⽂件中使⽤“_syscall0(pid_t, gettid)”不当引起的./test.o: In function `gettid()':./test.h:17: multiple definition of `gettid()'正确的⽤法是使⽤"inline"或"static inline"修饰⼀下:inline _syscall0(pid_t, gettid)或static inline _syscall0(pid_t, gettid)当然也可以这样:在.h头⽂件中:extern "C" pid_t gettid(void);在.cpp⽂件中:_syscall0(pid_t, gettid)_syscall0是⼀个宏,定义⼀个函数的实现。

常见gcc 编译错误整理

常见gcc 编译错误整理

常见gcc 编译错误整理常见gcc 编译错误整理(开始) 11 error: expected expression before 'else' else之前无表达式。

2 error: lvalue required as left operand of assignment 左值问题。

3 error: invalid storage class for function 'XXXXXX' 在文件的某个地方,丢失了一个大括号‘}’。

常见gcc编译警告整理(开始)1、warning: no newline at end of file 在文件最后一行加上回车键解释:在《Rationale for the C99 standard》一文中,有C99的相关信息:A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines. In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing abackslash/newline sequence.c/c++代码的每一行后面有一个“结束符”,也就是newline。

避免当被include的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。

gcc报错

gcc报错

个人总结:1. gcc 预处理阶段-E常见错误:No such file or directorygcc -E file.c -o file.i 其中file.i为预处理后的c文件,gcc所做的工作是将头文件的内容迭代包含到i 文件,c文件的代码不变。

此时如果gcc在默认路径没有搜索到c 文件中包含的h文件,则出现错误。

i 文件仍是c文件。

解决办法:增加搜索路径。

2.gcc 编译阶段-S常见错误:变量未声明;expected ";" before ;提供给函数"function-name"的参数太少这一阶段将c文件转为s 汇编文件,会对变量是否声明,“;”是否缺失等进行简单语法检查;但并不对函数是否声明进行检查,即使没有声明第一次使用,函数转换后的汇编为:call function-name 。

解决办法:查看变量的声明是否被包含进c文件,是否头文件未包含,或根本未定义。

语句末加" ; "。

函数声明的参数少于调用时的参数不会出现问题,反过来就不可以。

3.gcc 汇编阶段-c4.gcc 链接阶段常见错误:a) 如:In function ' main': undefined reference to ' funtion-name'Collect2: ld return 1解决办法:不能找到函数的声明,看是否函数声明了,或者相应的头文件有无包含。

b) 如:解决办法:5 Segmentation fault报错Char* string;String = (char*)malloc(sizeof(char)*1000);String="";Strcat(string, "sfasfasf");原因:string="", 使string指针指向另一块地址,不再是malloc申请的地址。

gcc编译通过,运行却显示“段错误”的解决方法

gcc编译通过,运行却显示“段错误”的解决方法

gcc编译通过,运⾏却显⽰“段错误”的解决⽅法第⼀次在Liunx上(liunx mint 17)使⽤gcc编译c⽂件,竟然提⽰“找不到stdio.h",经过google后发现执⾏sudo apt-get install build-essential正⽂:刚学习了柔性数组,照教程写了⽤柔性数组⽣成斐波那契数列,经过⼀翻修改后gcc编译通过,运⾏时却提⽰“段错误”。

google⼀下说很可能是数组赿界导致的内存访问错误。

仔细检查果然是因为对未赋值的指针进⾏访问的缘故。

为避免这类问题以后凡是定义指针都要先初始化,还要严格注意对指针先赋值后访问。

修改前:typedef struct _soft_array{int len;int array[];}softarray;softarray* create_soft_array(int size){softarray* ret;ret->len = size;if( size > 0 ){return ret = (softarray*)malloc( sizeof(*ret) + sizeof(int)*size );}return ret = NULL;}修改后:typedef struct _soft_array{int len;int array[];}softarray;softarray* create_soft_array(int size){softarray* ret = NULL;if( size > 0 ){ret = (softarray*)malloc( sizeof(*ret) + sizeof(int)*size );ret->len = size;}return ret;}date:2014-10-25。

【GCC】gcc警告选项汇总--编辑中gcc编译选项

【GCC】gcc警告选项汇总--编辑中gcc编译选项

【GCC】gcc警告选项汇总--编辑中gcc编译选项⽬录参考原⽂:https:///qq_17308321/article/details/79979514前⾔警告:不是错误的,但是有风险或表明可能有错误。

英⽂原⽂:请求或取消警告选项加上-Wall吧,gcc 默认不加参数的情况下连定义了返回值的函数没有返回值都不报错。

-Wall,-Wextra 就是加-Wall 和-Wall不启动的选项也加上()-fsyntax-only检查代码中的语法错误,但除此之外不要做任何事情。

-w (⼩写)禁⽌所有警告消息。

-W (⼤写)以“ -W ”请求特定的警告 - 可以隐式地请求隐式声明的警告。

-W和-Wall的区别-Wall选项意思是编译后显⽰所有警告。

-W选项类似-Wall,会显⽰警告,但是只显⽰编译器认为会出现错误的警告。

在编译⼀些项⽬的时候可以-W和-Wall选项⼀起使⽤。

gcc -W -Wall test_w_wall testwwall.c-Werror=将指定的警告转换为错误。

请注意,指定-Werror = foo会⾃动隐含-W foo 。

但是, -Wno-error = foo并不意味着什么。

反过来:-Wno-error取消编译选项-Werror⽤途:假设我们使⽤了⼀个⼈的代码A⽬录,⾥⾯有⼀个-Werror的选项,把所有的警告当做错误;⼜使⽤了另⼀个⼈的代码B⽬录,⾥⾯存在⼀堆Warning。

这样,当我们把它们合在⼀起编译的时候,A中的-Werror选项会导致B的代码编译不过。

但我们⼜不想去修改B的代码,怎么办?⽅法是,先add_subdirectory(A),之后,加上⼀句set(CMAK_CXX_FLAGS "${CMAK_CXX_FLAGS} -Wno-error")-Wno-这个前缀,就是⽤来取消⼀个编译选项的然后,再add_subdirectory(B)-Wfatal-errors在发⽣第⼀个错误时中⽌编译。

gcc警告选项汇总

gcc警告选项汇总

gcc警告选项汇总
警告是诊断消息,报告的结构本质上不是错误的,但是有风险或表明可能有错误。

以下与语言无关的选项不会启用特定的警告,但会控制GCC生成的诊断类型。

-fsyntax-only
检查代码中的语法错误,但除此之外不要做任何事情。

-fmax-errors= n
将错误消息的最大数量限制为n ,此时GCC会缓存,而不是尝试继续处理源代码。

如果n为0(默认值),则生成的错误消息数量不受限制。

如果还指定了-Wfatal-errors ,则重大错误优先于此选项。

-w
禁止所有警告消息。

-Werror
使所有的警告进入错误。

-Werror=
将指定的警告转换为错误。

附加警告的说明符; 例如-Werror =开关将由-Wswitch控制的警告转换为错误。

此开关采用否定形式,用于否定-针对特定警告的错误; 例如-Wno-error =开关使得-wswitch警告不是错误,即使在-Werror有效时也是如此。

每个可控警告的警告消息都包含控制警告的选项。

那么该选项可以与-Werror =和-Wno-error =一起使用,如上所述。

(可以使用-fno-diagnostics-show-option标志禁用警告消息中的选项打印。

)请注意,指定-Werror = foo会自动隐含-W foo 。

但是,-Wno-error = foo并不意味着什么。

常见gcc编译警告

常见gcc编译警告

1、warning: no newline at end of file在文件最后一行加上回车键解释:在《Rationale for the C99 standard》一文中,有C99的相关信息:A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines、In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing abackslash/newline sequence、c/c++代码的每一行后面有一个“结束符”,也就就是newline。

避免当被include的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。

2、warning: comparison between pointer and integer解释:integer与pointer比较3、 warning: assignment discards qualifiers from pointer target type解释:赋值时,取消了右值的限定。

4、 warning: passing argument 1 of 'send' makes pointer from integer without a cast解释:函数send的第一个integer型参数没有强制转换为pointer型5、warning: comparison is always true due to limited range of data type解释:由于数据类型范围的限制,比较结果一直为真。

gcc错误解决方法(5篇)

gcc错误解决方法(5篇)

gcc错误解决方法(5篇)第一篇:gcc错误解决方法原因:因为安装其他软件,升级gcc相关的软件,造成gcc编译错误,说没有gcc,解决方法,用系统盘重新安装gcc。

具体方法如下:[root@mail /]# rpm-e--nodeps cpp[root@mail /]# rpm-qa | grep gcclibgcc-4.1.2-48.el5gcc-java-4.1.2-48.el5libgcc-4.1.2-48.el5gcc-c++-4.1.2-48.el5gcc-gfortran-4.1.2-48.el5[root@mail /]# rpm-ivh /root/rpm/cpp-4.1.2-46.el5.x86_64.rpmPreparing...#################################### ####### [100%]1:cpp########################################### [100%][root@mail /]# rpm-ivh /root/rpm/gcc-4.1.2-46.el5.x86_64.rpmPreparing...#################################### ####### [100%]1:gcc######################################### ## [100%][root@mail /]# rpm-qa | grep kernel-headerskernel-headers-2.6.18-194.26.1.el5[root@mail /]# rpm-e--nodeps kernel-headers[root@mail /]# rpm-qa | grep kernel-headers[root@mail /]# rpm-ivh /root/rpm/kernel-headers-2.6.18-164.el5.x86_64.rpmPreparing...#################################### ####### [100%]1:kernel-headers########################################## # [100%][root@mail /]# rpm-qa | grep glibc-headersglibc-headers-2.5-42[root@mail /]# rpm-qa | grep glibc-headersglibc-headers-2.5-42[root@mail /]# rpm-e--nodeps glibc-headers[root@mail /]# rpm-ivh /root/rpm/glibc-headers-2.5-42.x86_64.rpmPreparing...#################################### ####### [100%]1:glibc-headers########################################## # [100%][root@mail /]# rpm-qa | grep glibc-develglibc-devel-2.5-42glibc-devel-2.5-42[root@mail /]# rpm-e--nodeps glibc-develerror: “glibc-devel” specifies multiple packages[root@mail /]# rpm-q--queryformat “%{NAME}-%{VERSION}-%{RELEASE}(%{ARCH})n” glibc-devel glibc-devel-2.5-42(i386)glibc-devel-2.5-42(x86_64)[root@mail /]# rpm-e--nodeps glibc-devel*error: package glibc-devel* is not installed[root@mail /]# rpm-e--nodeps glibc-devel-2.5-42(i386)-bash: syntax error near unexpected token `('[root@mail /]# rpm-e--nodeps glibc-devel-2.5-42(i386)error: “glibc-devel-2.5-42” specifies multiple packageserror: package(i386)is not installed[root@mail /]# rpm-e--allmatches glibc-develerror: Failed dependencies:glibc-devel >= 2.2.90-12 is needed by(installed)gcc-4.1.2-46.el5.x86_64[root@mail /]# rpm-qa | grep gcclibgcc-4.1.2-48.el5gcc-java-4.1.2-48.el5libgcc-4.1.2-48.el5gcc-c++-4.1.2-48.el5gcc-gfortran-4.1.2-48.el5gcc-4.1.2-46.el5[root@mail /]# rpm-qa | grep glibc-develglibc-devel-2.5-42glibc-devel-2.5-42[root@mail /]# rpm-e--allmatches--nodeps glibc-devel[root@mail /]# rpm-qa | grep glibc-devel[root@mail /]# rpm-ivh /root/rpm/glibc-devel-2.5-42.i386.rpmerror: Failed dependencies:binutils < 2.15.94.0.2-1 conflicts with glibc-devel-2.5-42.i386 [root@mail /]# rpm-ivh /root/rpm/glibc-devel-2.5-42.x86_64.rpmerror: Failed dependencies:binutils < 2.15.94.0.2-1 conflicts with glibc-devel-2.5-42.x86_64[root@mail /]# rpm-qa | grep binutilsbinutils-2.15.92.0.2-13.0.0.0.2binutils-2.17.50.0.6-14.el5[root@mail /]# rpm-q--queryformat “%{NAME}-%{VERSION}-%{RELEASE}(%{ARCH})n” binutils binutils-2.17.50.0.6-14.el5(x86_64)binutils-2.15.92.0.2-13.0.0.0.2(x86_64)[root@mail /]# rpm-e--allmatches--nodeps binutils/sbin/ldconfig: libraries libdb.so.2 and libgdbm.so.2.0.0 in directory /usr/lib have same soname but different type./sbin/ldconfig: libraries libdb.so.2 and libgdbm.so.2.0.0 in directory /usr/lib have same soname but different type.[root@mail /]# rpm-q--queryformat “%{NAME}-%{VERSION}-%{RELEASE}(%{ARCH})n” binutils package binutils is not installed[root@mail /]# rpm-ivh /root/rpm/binutils-2.17.50.0.6-12.el5.x86_64.rpmPreparing...#################################### ####### [100%]1:binutils###################################### ##### [100%]/sbin/ldconfig: libraries libdb.so.2 and libgdbm.so.2.0.0 in directory /usr/lib have same soname but different type.[root@mail /]# rpm-ivh /root/rpm/glibc-devel-2.5-42.* Preparing...#################################### ####### [100%]1:glibc-devel########################################### [ 50%]2:glibc-devel########################################### [100%][root@mail /]# rpm-qa | grep libgomplibgomp-4.4.0-6.el5[root@mail /]# rpm-e--nodeps libgomp/sbin/ldconfig: libraries libdb.so.2 and libgdbm.so.2.0.0 in directory /usr/lib have same soname but different type.[root@mail /]# rpm-qa | grep libgomp[root@mail /]# rpm-qa | grep libgomp*[root@mail /]# rpm-qa | grep libstdc++-devellibstdc++-devel-4.1.2-48.el5[root@mail /]# rpm-e--nodeps libstdc++-devel[root@mail /]# rpm-ivh /root/rpm/libstdc++-devel*error: Failed dependencies:libstdc++ = 4.1.2-46.el5 is needed by libstdc++-devel-4.1.2-46.el5.i386libstdc++ = 4.1.2-46.el5 is needed by libstdc++-devel-4.1.2-46.el5.x86_64[root@mail /]# rpm-qa | grep libstdc++libstdc++-4.1.2-48.el5compat-libstdc++-33-3.2.3-61compat-libstdc++-296-2.96-138libstdc++-4.1.2-48.el5compat-libstdc++-33-3.2.3-61[root@mail /]# rpm-ivh /root/rpm/libstdc++-devel-4.1.2-46.el5.x86_64.rpmerror: Failed dependencies:libstdc++ = 4.1.2-46.el5 is needed by libstdc++-devel-4.1.2-46.el5.x86_64[root@mail /]# rpm-e--nodeps libstdc++error: “libstdc++” specifies multiple packages[root@mail /]# rpm-e--nodeps--allmatcheslibstdc++/sbin/ldconfig: libraries libdb.so.2 and libgdbm.so.2.0.0 in directory /usr/lib have same soname but different type./sbin/ldconfig: libraries libdb.so.2 and libgdbm.so.2.0.0 in directory /usr/lib have same soname but different type.[root@mail /]# rpm-ivh /root/rpm/libstdc++*Preparing...#################################### ####### [100%]1:libstdc++#################################### ####### [ 25%]/sbin/ldconfig: libraries libdb.so.2 and libgdbm.so.2.0.0 in directory /usr/lib have same soname but different type.2:libstdc++################################### ######## [ 50%]/sbin/ldconfig: libraries libdb.so.2 and libgdbm.so.2.0.0 in directory /usr/lib have same soname but different type.3:libstdc++-devel########################################### [ 75%]4:libstdc++-devel########################################### [100%][root@mail /]# rpm-ivh /root/rpm/compat-libstdc++-compat-libstdc++-296-2.96-138.i386.rpmcompat-libstdc++-33-3.2.3-61.i386.rpmcompat-libstdc++-33-3.2.3-61.x86_64.rpm[root@mail /]# rpm-ivh /root/rpm/compat-libstdc++-compat-libstdc++-296-2.96-138.i386.rpmcompat-libstdc++-33-3.2.3-61.i386.rpmcompat-libstdc++-33-3.2.3-61.x86_64.rpm[root@mail /]# rpm-ivh /root/rpm/compat-libstdc++-*Preparing...#################################### ####### [100%]package compat-libstdc++-33-3.2.3-61.x86_64 is already installedpackage compat-libstdc++-296-2.96-138.i386 is already installedpackage compat-libstdc++-33-3.2.3-61.i386 is already installed[root@mail /]# rpm-ivh /root/rpm/gcc-c++-4.1.2-46.el5.x86_64.rpmPreparing...#################################### ####### [100%]package gcc-c++-4.1.2-48.el5.x86_64(which is newer than gcc-c++-4.1.2-46.el5.x86_64)is already installedfile /usr/bin/c++ from install of gcc-c++-4.1.2-46.el5.x86_64 conflicts with file from package gcc-c++-4.1.2-48.el5.x86_64 file /usr/bin/g++ from install of gcc-c++-4.1.2-46.el5.x86_64 conflicts with file from package gcc-c++-4.1.2-48.el5.x86_64 file /usr/bin/x86_64-redhat-linux-c++ from install of gcc-c++-4.1.2-46.el5.x86_64 conflicts with file from package gcc-c++-4.1.2-48.el5.x86_64file /usr/bin/x86_64-redhat-linux-g++ from install of gcc-c++-4.1.2-46.el5.x86_64 conflicts with file from package gcc-c++-4.1.2-48.el5.x86_64file /usr/lib/gcc/x86_64-redhat-linux/4.1.1/32/libsupc++.a from install of gcc-c++-4.1.2-46.el5.x86_64 conflicts with file from package gcc-c++-4.1.2-48.el5.x86_64file /usr/lib/gcc/x86_64-redhat-linux/4.1.1/libsupc++.a from install of gcc-c++-4.1.2-46.el5.x86_64 conflicts with file from package gcc-c++-4.1.2-48.el5.x86_64file /usr/libexec/gcc/x86_64-redhat-linux/4.1.1/cc1plus from install of gcc-c++-4.1.2-46.el5.x86_64 conflicts with file from package gcc-c++-4.1.2-48.el5.x86_64file /usr/share/man/man1/g++.1.gz from install of gcc-c++-4.1.2-46.el5.x86_64 conflicts with file from package gcc-c++-4.1.2-48.el5.x86_64第二篇:LoadRunner错误及解决方法LoadRunner错误及解决方法[转]分类:性能测试一、Step download timeout(120 seconds)这是一个经常会遇到的问题,解决得办法走以下步骤:1、修改run time setting中的请求超时时间,增加到600s,其中有三项的参数可以一次都修改了,HTTP-request connect timeout,HTTP-request receieve timeout,Step download timeout,分别建议修改为600、600、5000;run time setting设置完了后记住还需要在controler组件的option的run time setting中设置相应的参数;2、办法一不能解决的情况下,解决办法如下:设置runt time setting中的internet protocol-preferences中的advaced区域有一个winlnet replay instead of sockets选项,选项后再回放就成功了。

gcc报告解读 -回复

gcc报告解读 -回复

gcc报告解读-回复什么是GCC?GCC(GNU Compiler Collection)是一个广泛使用的编程语言编译器套件。

它由GNU计划开发,是一个自由软件,并提供了对不同编程语言(如C、C++、Fortran等)的广泛支持。

GCC的目标是为开发者提供高质量的代码编译,以构建高效、可靠的软件系统。

GCC的组成部分:GCC由多个独立的组件组成,包括前端、中间代码和后端。

前端负责将源代码解析为中间代码表示形式,然后中间代码通过后端转换为目标平台的机器代码。

GCC的前端是针对不同编程语言的模块,负责将源代码解析、语法分析和语义分析,将源代码转换为中间表示形式,也称为GIMPLE或GENERIC 代码。

GCC的中间代码包括GIMPLE和RTL代码。

GIMPLE(GNU If-conversion and Modelling Package Language)是GCC的独立中间代码表示形式,它使用树的形式表示程序语义。

而RTL(Register Transfer Language)是一种机器无关的底层表示,描述了指令的操作和寄存器之间的依赖关系。

GCC的后端是负责将中间代码转化为特定目标平台的机器代码的模块。

它包括了目标平台特定的指令选择、寄存器分配和代码优化算法,最终生成可执行文件。

GCC的编译过程:GCC的编译过程可以分为四个主要的阶段:预处理、编译、汇编和链接。

预处理阶段将源代码中的预处理指令(如#include和#define等)进行处理,并展开宏定义,生成处理后的源代码文件。

编译阶段将处理后的源代码文件转换为汇编代码,这一阶段主要包括词法分析、语法分析和语义分析。

在此过程中,GCC还会执行一些优化策略来提高生成的目标代码的质量。

汇编阶段将汇编代码转换为目标平台的机器代码,即可执行文件的一部分。

这一阶段主要包括指令选择、寄存器分配和代码调度等步骤。

链接阶段将目标文件和库文件结合起来,生成最终的可执行文件。

Linux安装gcc时碰到的有关问题解决(解决gcc依赖有关问题)

Linux安装gcc时碰到的有关问题解决(解决gcc依赖有关问题)

Linux安装gcc时碰到的有关问题解决(解决gcc依赖有关问题)Linux安装gcc时碰到的有关问题解决(解决gcc依赖有关问题)rpm安装gcc时碰到的有关问题解决(解决gcc依赖有关问题)提⽰:error: Failed dependencies:cloog-ppl >= 0.15 is needed by gcc-4.4.7-4.el6.x86_64cpp = 4.4.7-4.el6 is needed by gcc-4.4.7-4.el6.x86_64rpm安装cloog-ppl会报:error: Failed dependencies:libppl.so.7()(64bit) is needed by cloog-ppl-0.15.7-1.2.el6.x86_64libppl_c.so.2()(64bit) is needed by cloog-ppl-0.15.7-1.2.el6.x86_64rpm安装cpp会报:error: Failed dependencies:libmpfr.so.1()(64bit) is needed by cpp-4.4.7-4.el6.x86_64安装软件包前期准备⼯作:1.挂载光盘镜像到mnt⽬录下。

(学习推荐),下⾯说说挂载命令[root@localhost ~]# mount /dev/cdrom /mnt/[root@localhost Packages]#挂载成功后,进⼊到包所在⽬录[root@localhost ~]# cd /mnt/Packages/[root@localhost Packages]#2.⽹上去下载需要安装的包。

在安装gcc时我们基本都会碰到这样的错误提⽰:1》安装gcc包,并报错了:[root@localhost Packages]# rpm -ivh gcc-4.4.7-4.el6.x86_64.rpmwarning: gcc-4.4.7-4.el6.x86_64.rpm: Header V3 RSA/SHA1Signature, key ID c105b9de: NOKEYerror: Failed dependencies:cloog-ppl >= 0.15 is needed by gcc-4.4.7-4.el6.x86_64cpp = 4.4.7-4.el6 is needed by gcc-4.4.7-4.el6.x86_64[root@localhost Packages]#上⾯的报错说明:缺少两个依赖关系包(cloog-ppl和cpp),那么我们只需要安装这两个包就⾏了。

gcc毛病提示详解

gcc毛病提示详解

conversion from %s to %s not supported by iconv”iconv 不支持从%s 到%s 的转换”iconv_open”iconv_open”no iconv implementation, cannot convert from %s to %s”没有iconv 的实现,无法从%s 转换到%s”character 0x%lx is not in the basic source character set\n”字符0x%lx 不在基本源字符集中\n”converting to execution character set”转换到可执行文件的字符集”character 0x%lx is not unibyte in execution character set”字符0x%lx 在执行字符集中不是单字节的”Character %x might not be NFKC”字符%x 可能不是NFKC”universal character names are only valid in C++ and C99″Unicode 字符名只在C++ 和C99 中有效”the meaning of ‘\\%c’ is different in traditional C”‘\\%c’的意义与在传统 C 中不同”In _cpp_valid_ucn but not a UCN”在_cpp_valid_ucn 中但不是一个UCN”incomplete universal character name %.*s”不完全的Unicode 字符名%.*s”%.*s is not a valid universal character”%.*s 不是一个有效的Unicode 字符”‘$’ in identifier or number”‘$’出现在标识符或数字中”universal character %.*s is not valid in an identifier”Unicode 字符%.*s 在标识符中无效”universal character %.*s is not valid at the start of an identifier”Unicode 字符%.*s 在标识符开头无效”converting UCN to source character set”将UCN 转换到源字符集”converting UCN to execution character set”将UCN 转换到执行字符集”the meaning of ‘\\x’ is different in traditional C”‘\\x’的意义与在传统 C 中不同”\\x used with no following hex digits”\\x 后没有16 进制数字”hex escape sequence out of range”16 进制转义序列越界”octal escape sequence out of range”8 进制转义序列越界”the meaning of ‘\\a’ is different in traditional C”‘\\a’的意义与在传统 C 中不同”non-ISO-standard escape sequence, ‘\\%c’”非ISO 标准的转义序列,‘\\%c’”unknown escape sequence: ‘\\%c’”未知的转义序列:‘\\%c’”unknown escape sequence: ‘\\%s’”未知的转义序列:‘\\%s’”converting escape sequence to execution character set”将转义序列转换到执行字符集”character constant too long for its type”字符常量大小超出其类型”multi-character character constant”多字节字符常量”empty character constant”空的字符常量”failure to convert %s to %s”无法从%s 转换到%s”extra tokens at end of #%s directive”#%s 指示的末尾有多余的标识符”#%s is a GCC extension”#%s 是一个GCC 扩展”#%s is a deprecated GCC extension”#%s 是一个已过时的GCC 扩展”suggest not using #elif in traditional C”建议在传统 C 中不使用#elif”traditional C ignores #%s with the # indented”当# 有缩进时传统 C 忽略#%s”suggest hiding #%s from traditional C with an indented #”建议使用缩进的# 以让#%s 对传统 C 不可见”embedding a directive within macro arguments is not portable”将一个指示嵌入宏参数中是不可移植的”style of line directive is a GCC extension”line 指示的风格是一个GCC 扩展”invalid preprocessing directive #%s”无效的预处理指示#%s”\”defined\” cannot be used as a macro name”“defined”不能被用作宏名”\”%s\” cannot be used as a macro name as it is an operator in C++”“%s”不能被用作宏名,因为它是C++ 中的一个操作符”no macro name given in #%s directive”#%s 指示中未给出宏名”macro names must be identifiers”宏名必须是标识符”undefining \”%s\”"取消对“%s”的定义”missing terminating > character”缺少结尾的> 字符”#%s expects \”FILENAME\” or ”#%s 需要\”FILENAME\”或”empty filename in #%s”#%s 中文件名为空”#include nested too deeply”#include 嵌套过深”#include_next in primary source file”#include_next 出现在主源文件中”invalid flag \”%s\” in line directive”line 指示中有无效的标记“%s””unexpected end of file after #line”#line 后未预期的文件结束”\”%s\” after #line is not a positive integer”#line 后的“%s”不是一个正整数”line number out of range”行号超出范围”\”%s\” is not a valid filename”“%s”不是一个有效的文件名”\”%s\” after # is not a positive integer”# 后的“%s”不是一个正整数”invalid #%s directive”无效的#%s 指示”registering pragmas in namespace \”%s\” with mismatched name expansion”在命名空间“%s”中注册pragma 时名称扩展不匹配”registering pragma \”%s\” with name expansion and no namespace”pragma “%s”被注册为一个命名扩展,而没有命名空间”registering \”%s\” as both a pragma and a pragma namespace”“%s”既被注册为一个pragma 又被注册为一个pragma 命名空间”#pragma %s %s is already registered”#pragma %s %s 已经被注册”#pragma %s is already registered”#pragma %s 已经被注册”registering pragma with NULL handler”pragma 注册为被NULL 处理”#pragma once in main file”#pragma once 出现在主文件中”invalid #pragma push_macro directive”无效的#pragma push_macro 指示”invalid #pragma pop_macro directive”无效的#pragma pop_macro 指示”invalid #pragma GCC poison directive”无效的#pragma GCC poison 指示”poisoning existing macro \”%s\”"对已存在的宏“%s”投毒”#pragma system_header ignored outside include file”#pragma system_heade 在包含文件外被忽略”cannot find source file %s”找不到源文件%s”current file is older than %s”当前文件早于%s”_Pragma takes a parenthesized string literal”_Pragma 需要一个括起的字符串字面常量”#else without #if”#else 没有匹配的#if”#else after #else”#else 出现在#else 后”the conditional began here”条件自此开始”#elif without #if”#elif 没有匹配的#if”#elif after #else”#elif 出现在#else 后”#: directives.c:1960#endif without #if”#endif 没有匹配的#if”missing ‘(‘ after predicate”谓词后缺少‘(’”missing ‘)’ to complete answer”完整的答案缺少‘)’”predicate’s answer is empty”谓词的答案为空”assertion without predicate”断言后没有谓词”predicate must be an identifier”谓词必须是一个标识符”\”%s\” re-asserted”重断言“%s””unterminated #%s”未终止的#%s”unterminated comment”未结束的注释”stdout”stdout”%s: %s”%s:%s”too many decimal points in number”数字中有太多小数点”fixed-point constants are a GCC extension”定点常量是一个GCC 扩展”invalid digit \”%c\” in binary constant”二进制常量中有无效数字“%c””invalid digit \”%c\” in octal constant”8 进制常量中有非法字符“%c””invalid prefix \”0b\” for floating constant”浮点常量的“0b”前缀无效”use of C99 hexadecimal floating constant”使用C99 式的16 进制浮点常量”exponent has no digits”指数部分没有数字”hexadecimal floating constants require an exponent”16 进制浮点常量需要指数部分”invalid suffix \”%.*s\” on floating constant”浮点常量的“%.*s”后缀无效”traditional C rejects the \”%.*s\” suffix”传统 C 不接受“%.*s”后缀”suffix for double constant is a GCC extension”双精度常量后缀是一个GCC 扩展”invalid suffix \”%.*s\” with hexadecimal floating constant”十六进制浮点常量的“%.*s”后缀无效”decimal float constants are a GCC extension”十进制浮点常量是一个GCC 扩展”invalid suffix \”%.*s\” on integer constant”整数常量的“%.*s”后缀无效”use of C++0x long long integer constant”使用C++0x long long 整数常量”imaginary constants are a GCC extension”虚数常量是一个GCC 扩展”binary constants are a GCC extension”二进制常量是一个GCC 扩展”integer constant is too large for its type”整数常量值超出其类型”integer constant is so large that it is unsigned”整数常量太大,认定为unsigned”missing ‘)’ after \”defined\”"“defined”后出现‘)’”operator \”defined\” requires an identifier”操作符“defined”需要一个标识符”(\”%s\” is an alternative token for \”%s\” in C++)”(在C++ 中“%s”会是“%s”的替代标识符)”this use of \”defined\” may not be portable”使用“defined”可能不利于移植”floating constant in preprocessor expression”浮点常量出现在预处理表达式中”imaginary number in preprocessor expression”预处理表达式中出现虚数”\”%s\” is not defined”“%s”未定义”assertions are a GCC extension”断言是一个GCC 扩展”assertions are a deprecated extension”断言是一个已过时的GCC 扩展”missing binary operator before token \”%s\”"标识符“%s”前缺少二元运算符”token \”%s\” is not valid in preprocessor expressions”标识符“%s”在预处理表达式中无效”missing expression between ‘(‘ and ‘)’”‘(’与‘)’之间缺少表达式”%s with no expression”%s 后没有表达式”operator ‘%s’ has no right operand”操作符‘%s’没有右操作数”operator ‘%s’ has no left operand”操作符‘%s’没有左操作数”‘:’ without preceding ‘?’”‘:’前没有‘?’”unbalanced stack in %s”%s 中堆栈不平衡”impossible operator ‘%u’”不可能的操作‘%u’”missing ‘)’ in expression”表达式中缺少‘)’”‘?’ without following ‘:’”‘?’后没有‘:’”integer overflow in preprocessor expression”预处理表达式中整数溢出”missing ‘(‘ in expression”表达式中缺少‘(’”the left operand of \”%s\” changes sign when promoted”“%s”的左操作数在提升时变换了符号”the right operand of \”%s\” changes sign when promoted”“%s”的右操作数在提升时变换了符号”traditional C rejects the unary plus operator”传统 C 不接受单目+ 运算符”comma operator in operand of #if”#if 操作数中出现逗号”division by zero in #if”#if 中用零做除数”NULL directory in find_file”find_file 中有NULL 目录”one or more PCH files were found, but they were invalid”找到一个或多个PCH 文件,但它们是无效的”use -Winvalid-pch for more information”使用-Winvalid-pch 以获得更多信息”%s is a block device”%s 是一个块设备”%s is too large”%s 过大”%s is shorter than expected”%s 短于预期”no include path in which to search for %s”没有包含路径可供搜索%s”Multiple include guards may be useful for:\n”多个防止重包含可能对其有用:\n”cppchar_t must be an unsigned type”cppchar_t 必须是无符号型”preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits”预处理算术的最高精度为%lu 位;目标需要%lu 位”CPP arithmetic must be at least as precise as a target int”CPP 算术必须至少具有目标int 的精度”target char is less than 8 bits wide”目标char 短于8 位”target wchar_t is narrower than target char”目录wchar_t 短于目标char”target int is narrower than target char”目标int 短于目标char”CPP half-integer narrower than CPP character”CPP 半整数短于CPP 字符”CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits”在此宿主机上,CPP 不能处理长于%lu 位的宽字符常量,但目标需要%lu 位”backslash and newline separated by space”反斜杠和换行为空格所分隔”backslash-newline at end of file”反斜杠续行出现在文件末尾”trigraph ??%c converted to %c”三元符??%c 转换为%c”trigraph ??%c ignored, use -trigraphs to enable”三元符??%c 被忽略,请使用-trigraphs 来启用”\”/*\” within comment”“/*”出现在注释中”%s in preprocessing directive”预处理指示中出现%s”null character(s) ignored”忽略空字符”`%.*s’ is not in NFKC”‘%.*s’不在NFKC 中”`%.*s’ is not in NFC”‘%.*s’不在NFC 中”attempt to use poisoned \”%s\”"试图使用有毒的“%s””__VA_ARGS__ can only appear in the expansion of a C99 variadic macro”__VA_ARGS__ 只能出现在C99 可变参数宏的展开中”identifier \”%s\” is a special operator name in C++”标识符“%s”是C++ 中的一个特殊操作符”raw string delimiter longer than 16 characters”原始字符串分隔符长过16 个字符”invalid character ‘%c’ in raw string delimiter”原始字符串分隔符中有无效字符‘%c’”unterminated raw string”未终止的原始字符串”null character(s) preserved in literal”空字符将保留在字面字符串中”missing terminating %c character”缺少结尾的%c 字符”C++ style comments are not allowed in ISO C90″C++ 风格的注释在ISO C90 中不被允许”(this will be reported only once per input file)”(此警告为每个输入文件只报告一次)”multi-line comment”多行注释”unspellable token %s”无法拼出的标识符%s”macro \”%s\” is not used”宏“%s”未被使用”invalid built-in macro \”%s\”"无效的内建宏“%s””could not determine file timestamp”无法决定文件的时间戳”could not determine date and time”无法决定日期与时间”__COUNTER__ expanded inside directive with -fdirectives-only”带-fdirectives-only 时__COUNTER__ 在指示中扩展”invalid string literal, ignoring final ‘\\’”无效的字面字符串,忽略最后的‘\\’”pasting \”%s\” and \”%s\” does not give a valid preprocessing token”毗连“%s”和“%s”不能给出一个有效的预处理标识符”ISO C99 requires rest arguments to be used”ISO C99 需要使用剩余的参数”macro \”%s\” requires %u arguments, but only %u given”宏“%s”需要%u 个参数,但只给出了%u 个”macro \”%s\” passed %u arguments, but takes just %u”宏“%s”传递了%u 个参数,但只需要%u 个”unterminated argument list invoking macro \”%s\”"调用宏“%s”时参数列表未终止”function-like macro \”%s\” must be used with arguments in traditional C”类似函数的宏“%s”在传统 C 中必须与参数一起使用”invoking macro %s argument %d: empty macro arguments are undefined in ISO C90 and ISO C++98″调用宏%s 的参数%d:空的宏参数未被ISO C90 和ISO C++98 定义”duplicate macro parameter \”%s\”"重复的宏参数“%s””\”%s\” may not appear in macro parameter list”“%s”不能出现在宏参数列表中”macro parameters must be comma-separated”宏参数必须由逗号隔开”parameter name missing”缺少形参名”anonymous variadic macros were introduced in C99″匿名可变参数宏在C99 中被引入”ISO C does not permit named variadic macros”ISO C 不允许有名的可变参数宏”missing ‘)’ in macro parameter list”在宏参数表中缺少‘)’”‘##’ cannot appear at either end of a macro expansion”‘##’不能出现在宏展开的两端”ISO C99 requires whitespace after the macro name”ISO C99 要求宏名后必须有空白”missing whitespace after the macro name”宏名后缺少空白”‘#’ is not followed by a macro parameter”‘#’后没有宏参数”\”%s\” redefined”“%s”重定义”this is the location of the previous definition”这是先前定义的位置”macro argument \”%s\” would be stringified in traditional C”宏参数“%s”将在传统 C 中被字符串化”invalid hash type %d in cpp_macro_definition”cpp_macro_definition 中有无效的散列类型%d”while writing precompiled header”在写入预编译头时”%s: not used because `%.*s’ is poisoned”%s:未使用因为‘%.*s’已被投毒”%s: not used because `%.*s’ not defined”%s:未使用因为‘%.*s’未定义”%s: not used because `%.*s’ defined as `%s’ not `%.*s’”%s:未使用因为‘%.*s’被定义为‘%s’而非‘%*.s’”%s: not used because `%s’ is defined”%s:未使用因为‘%s’已定义”%s: not used because `__COUNTER__’ is invalid”%s:未使用因为‘__COUNTER__’无效”while reading precompiled header”在读取预编译头时”detected recursion whilst expanding macro \”%s\”"展开宏“%s”时检测到递归”syntax error in macro parameter list”宏参数列表语法错误”#~ warning: ”#~ 警告:”#~ internal error: ”#~ 内部错误:”#~ error: ”#~ 错误:”#~ In file included from %s:%u”#~ 在包含自%s:%u 的文件中”#~ ”#~ “,\n”#~ ” from %s:%u”#~ ”#~ “,\n”#~ ”从%s:%u”#~ no newline at end of file”#~ 文件未以空白行结束”。

GCC警告选项例解

GCC警告选项例解

GCC警告选项例解程序员是追求完美的一族,即使是一般的程序员大多也都不想看到自己的程序中有甚至那么一点点的瑕疵。

遇到任意一条编译器警告都坚决不放过。

有人会说:我们可以使用比编译器更加严格的静态代码检查工具,如splint。

这个建议也很不错。

不过lint工具使用起来较繁琐,有时候还需要记住一些特定符号并插入到你自己的代码中才行,门槛较高,这也让很多人止步于此。

那么我们就从此放弃么?不,如今的编译器做得都很好,它可以帮助我们的找到绝大多数可能出现问题的代码,前提是你要学会控制编译器去找到这些问题代码,而熟悉编译器的警告选项恰恰是体现控制力的好方法。

当你可以自如控制编译器警告输出的时候,你就算是'入道'了,同时你对语言的理解也更进一步了。

有人说:我就是用一个-Wall选项就可以了,一般选手可以这么做,而且他可以不知道-Wall会跟踪哪些类型的问题;但是高级选手是不会只使用-Wall的,他会把每条警告都研究的很透彻,会在Makefile中列出他想让编译器输出哪些类型的警告以替代-Wall,他会屏蔽掉那些对他的代码'毫无用处'的警告(很可能他使用了编译器对语言的扩展功能),他会有个和编译器交流的过程。

俗话说:'工欲善其事,必先利其器',一直在工作中使用GNU C编译器(以下简称GCC),这里对GCC的一些警告选项细致的分析,并列举几个简单的例子[注1]供分析参考。

1. -Wall集合警告选项我们平时可能大多数情况只使用-Wall编译警告选项,实际上-Wall选项是一系列警告编译选项的集合。

下面逐一分析这一集合中的各个选项:[-Wchar-subscripts]如果数组使用char类型变量做为下标值的话,则发出警告。

因为在某些平台上char可能默认为signed char,一旦溢出,就可能导致某些意外的结果。

e.g./* test_signed_char.c */#includeint main () {char c = 255; // 我们以为char是无符号的,其范围应该是[0,255]int i = 0;int a[256];for (i = 0; i < 256; i++) {a[i] = 1;}printf("%d\n", c); // 我们期待输出255printf("%d\n", a[c]); // 我们期待输出1printf("%d\n", a[255]);return 0;}gcc -Wchar-subscripts test_signed_char.ctest_signed_char.c: In function `main':test_signed_char.c:13: warning: array subscript has type `char'其输出结果:-1-41974761从输出结果来看Solaris 9/gcc 3.2上char默认实现类型为signed char;在Windows XP/gcc-3.4.2上也是一样。

gccstatic静态编译选项提示错误:usrlibld:cannotfind-lc

gccstatic静态编译选项提示错误:usrlibld:cannotfind-lc

gccstatic静态编译选项提⽰错误:usrlibld:cannotfind-lc 在学习gcc静态库动态库编译的时候选⽤静态库编译时出错显⽰:/usr/lib/ld:cannot find -lc百度:/usr/lib/ld:cannot find -lc多处给的解决⽅案为:然⽽并不能解决问题,最终定位发现是静态编译的问题。

⽽且不⽌会出现这种情况:/usr/lib/ld:cannot find -lc/usr/lib/ld:cannot find -lgcc_s/usr/lib/ld:cannot find -lm等的错误,主要原因在静态编译时需要链接静调库。

如上命令:[xiaohexiansheng@centos6 app]$ gcc -static -I./libs main.c -o app -L./libs -lcrypto -lfunc如果在编译时去掉-static选项选⽤动态库编译则不会出现此种情况[xiaohexiansheng@centos6 app]$ gcc -I./libs main.c -o app -L./libs -lcrypto -lfunc[xiaohexiansheng@centos6 app]$ lsapp libs main.c⾮静态编译时ldd filename,显⽰如下,这是可执⾏程序所需的动态库,运⾏可执⾏程序时需要的动态库。

[xiaohexiansheng@centos6 app]$ ldd applinux-gate.so.1 => (0x004ad000)libcrypto.so => /usr/lib/libcrypto.so (0x03ad9000)libfunc.so => not foundlibc.so.6 => /lib/libc.so.6 (0x0052a000)libdl.so.2 => /lib/libdl.so.2 (0x0070c000)libz.so.1 => /lib/libz.so.1 (0x00713000)/lib/ld-linux.so.2 (0x00508000)静态编译时需要将所有的.a库链接到可执⾏⽂件中,所以需要libc静态库⽂件,在系统找查找glibc-static提⽰没有库⽂件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

GCC常见错误解析一、错误类型第一类∶C语法错误错误信息∶文件source.c中第n行有语法错误(syntex errror)。

这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行之前的程序,有时也需要对该文件所包含的头文件进行检查。

有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,此时要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。

第二类∶头文件错误错误信息∶找不到头文件head.h(Can not find include file head.h)。

这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。

第三类∶档案库错误错误信息∶连接程序找不到所需的函数库,例如∶ld: -lm: No such file or directory.这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。

第四类∶未定义符号错误信息∶有未定义的符号(Undefined symbol)。

这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc 连接选项中的-l和-L项。

排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说只是开了个头。

这个过程中的错误,只是我们在使用C语言描述一个算法中所产生的错误,是比较容易排除的。

我们写一个程序,到编译、连接通过为止,应该说刚刚开始,程序在运行过程中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,还需要更加深入地测试、调试和修改。

一个程序,稍为复杂的程序,往往要经过多次的编译、连接和测试、修改。

二、常见错误信息解析与处理11、预处理时的错误信息No such file or directory中文含义:没有相应文件或目录错误原因:编译器的搜索路径上找不到所需要的文件。

该文件可能已在命令行中指定,或在 #include 语句中说明。

处理方法:查看文件名是否正确,或文件所存放的目录是否已添加到系统目录或链接目录中。

以下是样例:#include <stdoi.h> /* 错误:文件名不正确 */int main (void){printf ("Hello World!\n");return 0;}上面的程序试图引入一个不存在的文件‘stdoi.h’ ,这就会引发如下错误:‘stdoi.h: No such file or directory’。

而正确的文件名应该是‘stdio.h’。

macro or '#include' recursion too deep中文含义:宏或'#include'递归太深错误原因:语句 #include 嵌套太深。

当预处理器遇到太多嵌套的 #include 指令时,会导致此错误。

通常该错误由两个或多个文件进行相互引用时,会引发无限递归。

如:/* foo.h */#include "bar.h".../* bar.h */#include "foo.h"...解决方法是确保各文件没有互相引用。

invalid preprocessing directive #...中文含义:非法的预处理命令#...错误原因:该错误指明预处理器遇到了不可识别的 # 命令。

如:#if FOOint x = 1;#elseif BAR /* 应写成 #elif */int x = 2;#elseint x = 3;#endif预处理器语法在 #if 块中需要 #elif 而不是 "else if" 条件,也不是#elseif。

warning: This file includes at least one deprecated or2antiquated header.中文含义:警告:文件中至少引用了一个已废弃的或过时的头文件错误原因:该错误通常是在C++程序中引用了旧式的头文件库,如’iostream.h’, 在现代C++库头文件没有’.h’扩展名。

旧头文件导入其函数到顶层全局名字空间,对C++需要使用std:: 名字空间。

当然,对旧式风格的头文件仍然支持,所以对现有程序会继续编译,只是给出警告。

如:#include <iostream.h> /* 旧式风格 */int main (void){cout << "Hello World!\n";return 0;}‘iostream.h’应改写为 #include <iostream> 及 std::cout 。

unterminated '#if' conditional中文含义:'#if' 语句条件没有终止错误原因:缺少 #endif 语句2、编译时的错误信息'variable' undeclared (first use in this function)中文含义:变量'variable' 没有声明(第一次使用此变量)解决方法:在使用前声明该变量。

解析:在C和C++中,变量必须先声明后使用。

如:int main (void){int i;j = 0; /* j变量没声明 */return j;}此例中,j是没经声明的变量,所以将触发错误:'j' undeclared.parse error before '...'中文含义:在 'XXX' 语句前解析错误错误原因:语法错误解析:通常是编译器遇到了未期望的输入。

如:不合语法的字符串序列。

此错误也可能因为丢失花括号、园括号或分号,或写了非法的保留字而引发。

#include <stdio.h>int main (void){3printf ("Hello ") /* 丢失分号 */printf ("World!\n");return 0;}conflicting types for 'Alex'中文含义:对 'Alex' 变量存在突出类型错误原因:前面可能已对 'Alex' 声明了其它数据类型。

例如:存在两条语句分别声明了两次'Alex'变量为两种枚举 (enum) 类型。

two or more data types in declaration specifiers中文含义:在声明标识符中存在多种数据类型最容易出现这样的错误,原因是在程序里少了个“;”号。

有可能在头文件里,也有可能在本文件中(最容易出错的是在结构体中忘了“;”)。

too many types in declaration中文含义:在声明中定义太多的类型1.是否多次包含着个头文件?检查一下例如:#ifndef TConfigH#define TConfigH#endif //是否少了这个2.看下将长语句分为多行时,与下一行语句间是否少了逻辑运算符关系,关系运算符之类的符号warning: comparison between pointer and integer中文含义:警告:对指针和整型值进行比较可能没问题。

此警告通常是由'if (strstr(line,"word") != NULL )' 之类的strstr 函数返回指针或空值。

subscripted value is neither array nor pointer中文含义:下标值不符合数组或指针要求错误原因:企图使用可变的变量作为下标floppyto.c:782: parse error at end of input中文含义:在文件尾部解析错误floppyto.c 是程序文件名, 782 是错误行数,但该数字大于文件长度。

错误原因:存在没配对的花括号{}或注解 /* */#include <stdio.h>int main (void) {if (1) {4printf ("Hello World!\n");return 0; /* 花括号不匹配 */}parse error before 'printf'中文含义:在'printf' 之前解析错误错误原因:在该语句之前缺少分号 ';'warning: implicit declaration of function '...'中文含义:警告:与函数 XXX 的隐式声明不相符错误原因:该错误是因为使用的函数没有原型声明而产生。

产生的因为可以是导入错误的头文件,或忘记提供函数原型。

如:int main (void){printf ("Hello World!\n"); /* 没有头文件 */return 0;}程序中没有导入系统头文件’stdio.h’,所以也就不存在 printf 的原型声明。

改正方法:在程序最前面加入一行语句: #include <stdio.h>。

unterminated string or character constant中文含义:未终止的字符串或字符常量错误原因:该错误是因为使用字符串或字符常量缺少配对的引号而产生。

对字符而言,应使用成对的单引号,而对字符串,应使用成对的双引号。

#include <stdio.h>int main (void){printf ("Hello World!\n); /* 缺少闭双引号*/return 0;}character constant too long中文含义:字符常量太长错误原因:在C和C++中,字符常量是由单引号封装起来的单个字符,并且有相应的ASCII值。

如 'a' 对应的ASCII为67, 而 '\n' 对应的ASCII 为10。

相关文档
最新文档