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

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

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

C语言初学者遇到的最大问题往往是看不懂编译错误,进而不知如何修改程序。有鉴于此,本附录罗列了用gcc编译程序时经常出现的编译警告与错误。需要提醒读者的是,出现警告(warning)并不影响目标程序的生成,但出现错误(error)则无法生成目标程序。

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

#%s expects \\ or …

#%s 需要\\ 或…

#%s is a deprecated GCC extension

#%s 是一个已过时的GCC 扩展

#%s is a GCC extension

#%s 是一个GCC 扩展

#~ error:

#~ 错误:

#~ In 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 defined

%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

“%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__ 在指示中扩展

__V A_ARGS__ can only appear in the expansion of a C99 variadic macro __V A_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返回值。

"protocol_type" redefined

protocol_type重定义

anonymous variadic macros were introduced in C99

匿名可变参数宏在C99 中被引入

assertion without predicate

断言后没有谓词

assertions are a deprecated extension

断言是一个已过时的GCC 扩展

assertions are a GCC extension

断言是一个GCC 扩展

assignment discards qualifiers from pointer target type 赋值时,取消了右值的限定。

assignment from incompatible pointer type

不兼容的指针间赋值

attempt to use poisoned \%s\

试图使用有毒的“%s”

backslash and newline separated by space

反斜杠和换行为空格所分隔

backslash-newline at end of file

反斜杠续行出现在文件末尾

binary constants are a GCC extension

二进制常量是一个GCC 扩展

C++ style comments are not allowed in ISO C90

C++ 风格的注释在ISO C90 中不被允许

cannot find source

找不到源文件%s

Character %x might not be NFKC

字符%x 可能不是NFKC

character 0x%lx is not in the basic source character set\n

字符0x%lx 不在基本源字符集中\n

character 0x%lx is not unibyte in execution character set

字符0x%lx 在执行字符集中不是单字节的

character constant too long for its type

字符常量大小超出其类型

comma operator in operand of #if

#if 操作数中出现逗号

comparison between pointer and integer

integer与pointer比较

comparison is always false due to limited range of data type

由于数据类型范围的限制,比较结果一直为假

comparison is always true due to limited range of data type

由于数据类型范围的限制,比较结果一直为真。

conversion from %s to %s not supported by iconv

iconv 不支持从%s 到%s 的转换

converting escape sequence to execution character set

将转义序列转换到执行字符集

converting to execution character set

转换到可执行文件的字符集

converting UCN to execution character set

将UCN 转换到执行字符集

converting UCN to source character set

将UCN 转换到源字符集

could not determine date and time

无法决定日期与时间

could not determine

无法决定文件的时间戳

CPP arithmetic must be at least as precise as a target int

CPP 算术必须至少具有目标int 的精度

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 位

cppchar_t must be an unsigned type

cppchar_t 必须是无符号型

current older than %s

当前文件早于%s

decimal float constants are a GCC extension

十进制浮点常量是一个GCC 扩展

detected recursion whilst expanding macro \%s\

展开宏%s时检测到递归

division by zero in #if

#if 中用零做除数

duplicate macro parameter \%s\

重复的宏参数“%s”

embedding a directive within macro arguments is not portable

将一个指示嵌入宏参数中是不可移植的

empty character constant

空的字符常量

empty in #%s

#%s 中文件名为空

expected expression before 'else'

else之前无表达式

exponent has no digits

指数部分没有数字

extra tokens at end of #%s directive

#%s 指示的末尾有多余的标识符

failure to convert %s to %s

无法从%s 转换到%s

fixed-point constants are a GCC extension

定点常量是一个GCC 扩展

浮点常量出现在预处理表达式中

function-like macro \%s\ must be used with arguments in traditional C

类似函数的宏“%s”在传统 C 中必须与参数一起使用

hex escape sequence out of range

16 进制转义序列越界

hexadecimal floating constants require an exponent

16 进制浮点常量需要指数部分

identifier \%s\ is a special operator name in C++

标识符“%s”是C++ 中的一个特殊操作符

imaginary constants are a GCC extension

虚数常量是一个GCC 扩展

imaginary number in preprocessor expression

预处理表达式中出现虚数

impossible operator ‘%u’

不可能的操作‘%u’

In _cpp_valid_ucn but not a UCN

在_cpp_valid_ucn 中但不是一个UCN

incompatible implicit declaration of built-in function 'printf' 与内置的printf函数隐式声明不兼容。

incomplete universal character name %.*s

不完全的Unicode 字符名%.*s

initialization discards qualifiers from pointer target type

初始化取消了指针目标类型的限定。

initialization from incompatible pointer type

不兼容指针类型的初始化

integer constant is so large that it is unsigned

整数常量太大,认定为unsigned

integer constant is too large for its type

整数常量值超出其类型

预处理表达式中整数溢出

invalid #%s directive

无效的#%s 指示

invalid #pragma GCC poison directive

无效的#pragma GCC poison 指示

invalid #pragma pop_macro directive

无效的#pragma pop_macro 指示

invalid #pragma push_macro directive

无效的#pragma push_macro 指示

invalid built-in macro \%s\

无效的内建宏“%s”

invalid character ‘%c’ in raw string delimiter

原始字符串分隔符中有无效字符‘%c’

invalid digit \%c\ in binary constant

二进制常量中有无效数字“%c

invalid digit \%c\ in octal constant

8 进制常量中有非法字符“%c

invalid flag \%s\ in line directive

line 指示中有无效的标记“%s

invalid hash type %d in cpp_macro_definition

cpp_macro_definition 中有无效的散列类型%d

invalid prefix \0b\ for floating constant

浮点常量的“0b前缀无效

invalid preprocessing directive #%s

无效的预处理指示#%s

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

invalid string literal, ignoring final ‘\\’

无效的字面字符串,忽略最后的‘\\’

invalid suffix \%.*s\ on floating constant

浮点常量的“%.*s后缀无效

invalid suffix \%.*s\ on integer constant

整数常量的“%.*s后缀无效

invalid suffix \%.*s\ with hexadecimal floating constant

十六进制浮点常量的“%.*s后缀无效

invoking macro %s argument %d: empty macro arguments are undefined in ISO C90 and ISO C++98

调用宏%s 的参数%d:空的宏参数未被ISO C90 和ISO C++98 定义

ISO C does not permit named variadic macros

ISO C 不允许有名的可变参数宏

ISO C99 requires rest arguments to be used

ISO C99 需要使用剩余的参数

ISO C99 requires whitespace after the macro name

ISO C99 要求宏名后必须有空白

line number out of range

行号超出范围

lvalue required as left operand of assignment

左值问题

macro \%s\ is not used

宏“%s”未被使用

macro \%s\ passed %u arguments, but takes just %u

宏“%s”传递了%u 个参数,但只需要%u 个

macro \%s\ requires %u arguments, but only %u given

宏“%s需要%u 个参数,但只给出了%u 个

macro argument \%s\ would be stringified in traditional C

宏参数“%s”将在传统C 中被字符串化

macro names must be identifiers

宏名必须是标识符

macro parameters must be comma-separated 宏参数必须由逗号隔开

missing ‘(‘ after predicate

谓词后缺少‘(’

missing ‘(‘ in expression

表达式中缺少‘(’

missing ‘)’ after \defined\"

“defined 后出现‘)’

missing ‘)’ in expression

表达式中缺少‘)’

missing ‘)’ in macro parameter list

在宏参数表中缺少‘)’

missing ‘)’ to complete answer

完整的答案缺少‘)’

missing binary operator before token \%s\ 标识符“%”s前缺少二元运算符

missing expression between ‘(‘ and ‘)’

‘(’与‘)’之间缺少表达式

missing terminating %c character

缺少结尾的%c 字符

missing terminating > character

缺少结尾的> 字符

missing whitespace after the macro name

宏名后缺少空白

multi-character character constant

多字节字符常量

multi-line comment

多行注释

Multiple include guards may be useful for:\n 多个防止重包含可能对其有用:\n

no iconv implementation, cannot convert from %s to %s

没有iconv 的实现,无法从%s 转换到%s

no include path in which to search for %s

没有包含路径可供搜索%s

no macro name given in #%s directive

#%s 指示中未给出宏名

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的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。

non-ISO-standard escape sequence, ‘\\%c’

非ISO 标准的转义序列,‘\\%c’

null character(s) ignored

忽略空字符

null character(s) preserved in literal

空字符将保留在字面字符串中

NULL directory in find_file

find_file 中有NULL 目录

octal escape sequence out of range

8 进制转义序列越界

one or more PCH files were found, but they were invalid

找到一个或多个PCH 文件,但它们是无效的

operator \defined\ requires an identifier

操作符“defined需要一个标识符

operator ‘%s’ has no left operand

操作符‘%s’没有左操作数

operator ‘%s’ has no right operand

操作符‘%s’没有右操作数

passing argument 1 of 'mes_read_time' discards qualifiers from pointer target type12、

mes_函数第一个参数的传递,丢弃了指针目标类型限定。

parameter name missing

缺少形参名

passing argument 1 of 'send' makes pointer from integer without a cast

函数send的第一个integer型参数没有强制转换为pointer型

pasting \%s\ and \%s\ does not give a valid preprocessing token

毗连“%s”和“%s”不能给出一个有效的预处理标识符

poisoning existing macro \%s\

对已存在的宏“%s”投毒

predicate must be an identifier

谓词必须是一个标识符

predicate’s answer is empty

谓词的答案为空

preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits

预处理算术的最高精度为%lu 位;目标需要%lu 位

raw string delimiter longer than 16 characters

原始字符串分隔符长过16 个字符

registering \%s\ as both a pragma and a pragma namespace

“%s”既被注册为一个pragma 又被注册为一个pragma 命名空间

registering pragma \%s\ with name expansion and no namespace

pragma “%s”被注册为一个命名扩展,而没有命名空间

registering pragma with NULL handler

pragma 注册为被NULL 处理

registering pragmas in namespace \%s\ with mismatched name expansion

在命名空间“%s”中注册pragma 时名称扩展不匹配

return makes pointer from integer without a cast return使integer转换为pointer,没有加强制类型转换。

style of line directive is a GCC extension

line 指示的风格是一个GCC 扩展

suffix for double constant is a GCC extension

双精度常量后缀是一个GCC 扩展

suggest hiding #%s from traditional C with an indented #

建议使用缩进的# 以让#%s 对传统C 不可见

suggest not using #elif in traditional C

建议在传统C 中不使用#elif

syntax error in macro parameter list

宏参数列表语法错误

target char is less than 8 bits wide

目标char 短于8 位

target int is narrower than target char

目标int 短于目标char

target wchar_t is narrower than target char

目录wchar_t 短于目标char

the conditional began here

条件自此开始

the left operand of \%s\ changes sign when promoted

“%s的左操作数在提升时变换了符号

the meaning of ‘\\%c’ is different in traditional C

‘\\%c’的意义与在传统C 中不同

the meaning of ‘\\a’ is different in traditional C

‘\\a’的意义与在传统C 中不同

the meaning of ‘\\x’ is different in traditional C

‘\\x’的意义与在传统C 中不同

the right operand of \%s\ changes sign when promoted

“%s的右操作数在提升时变换了符号

this is the location of the previous definition

这是先前定义的位置

this use of \defined\ may not be portable

使用“defined可能不利于移植

token \%s\ is not valid in preprocessor expressions

标识符“%s”在预处理表达式中无效

too many decimal points in number

数字中有太多小数点

traditional C ignores #%s with the # indented

当# 有缩进时传统C 忽略#%s

traditional C rejects the \%.*s\ suffix

传统C 不接受“%.*s后缀

traditional C rejects the unary plus operator

传统C 不接受单目+ 运算符

trigraph ??%c converted to %c

三元符??%c 转换为%c

trigraph ??%c ignored, use -trigraphs to enable

三元符??%c 被忽略,请使用-trigraphs 来启用

unbalanced stack in %s

%s 中堆栈不平衡

undefining \%s\

取消对“%s”的定义

unexpected end of #line

#line 后未预期的文件结束

universal character %.*s is not valid at the start of an identifier Unicode 字符%.*s 在标识符开头无效

universal character %.*s is not valid in an identifier Unicode 字符%.*s 在标识符中无效

universal character names are only valid in C++ and C99

Unicode 字符名只在C++ 和C99 中有效

unknown escape sequence: ‘\\%c’

未知的转义序列:‘\\%c’

unknown escape sequence: ‘\\%s’

未知的转义序列:‘\\%s’

unspellable token %s

无法拼出的标识符%s

unterminated #%s

未终止的#%s

unterminated argument list invoking macro \%s\ 调用宏“%s”时参数列表未终止

unterminated comment

未结束的注释

unterminated raw string

未终止的原始字符串

use of C++0x long long integer constant

使用C++0x long long 整数常量

use of C99 hexadecimal floating constant

使用C99 式的16 进制浮点常量

use -Winvalid-pch for more information

使用-Winvalid-pch 以获得更多信息

while reading precompiled header

在读取预编译头时

while writing precompiled header

在写入预编译头时

GCC常见错误解析

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语言描述一个算法中所产生的错误,是比较容易排除的。我们写一个程序,到编译、连接通过为止,应该说刚刚开始,程序在运行过程中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,还需要更加深入地测试、调试和修改。一个程序,稍为复杂的程序,往往要经过多次的编译、连接和测试、修改。 二、常见错误信息解析与处理 1

gcc编译器使用简明指南

gcc编译器使用简明指南 gcc对文件的处理需要经过预处理->编译->汇编->链接的步骤,从而产生一个可执行文件,各部分对应不同的文件类型,具体如下: file.c c程序源文件 file.i c程序预处理后文件 file.cxx c++程序源文件,也可以是https://www.360docs.net/doc/579231775.html, / file.cpp / file.c++ file.ii c++程序预处理后文件 file.h c/c++头文件 file.s 汇编程序文件 file.o 目标代码文件 gcc [选项]文件列表 -ansi 强制完全ANSI一致 -c 仅编译或汇编,生成目标代码文件,将.c、.i、.s等文件生成.o文件,其余文件被忽略 -S 仅编译,不进行汇编和链接,将.c、.i等文件生成.s文件,其余文件被忽略 -E 仅预处理,并发送预处理后的.i文件到标准输出,其余文件被忽略 -o file 创建可执行文件并保存在file中,而不是默认文件a.out -g 产生用于调试和排错的扩展符号表,用于GDB调试,切记-g和-O通常不能一起使用 -w 取消所有警告 -W 给出更详细的警告 -O [num]优化,可以指定0-3作为优化级别,级别0表示没有优化 -x language 默认为-x none,即依靠后缀名确定文件类型,加上-x lan确定后面所有文件类型,直到下一个-x出现为止 -D macro[=]类似于源程序里的#define,在-D macro中的macro可被源程序识别,例如gcc -D NUM -D FILE=\"bbs.txt\" hello.c -o hello,第一个-D选项定义宏NUM,在程序中可以使用#ifdef来检查是否被设置,第二个-D定义宏FILE,在源程序中可用 -U macro 类似于源程序开头定义#undef macro,也就是取消源程序中的某个宏定义

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’

GCC 命令行详解

GCC 命令行详解 1。gcc包含的c/c++编译器 gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译 2。gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字 3。为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm。 4。-l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果

库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它放在/usr/X11R 6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc 目录下,那链接参数就是-L/aaa/bbb/ccc -ltest另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出" -L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm",这就是编译一个gtk1.2程序所需的gtk链接参数,xx-config除了--libs参数外还有一个参数是--cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config --libs --cflags,看看输出结果。现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个`xxxx-config --libs --cflags`,比如编译一个gtk程序:gcc gtktest.c `gtk-config --libs --cflags`这样就差不多了。注意`不是单引号,而是1键

1、GCC编译器的使用

linux下gcc编译器的使用 1、文件后缀名 .c C 源程序 .C C++ 源程序 .cc C++ 源程序 .cxx C++ 源程序 .m Objective –C源程序 .i 预处理过的c源程序 .ii 预处理过的C++源程序 .s 组合语言源程序 .S 组合语言源程序 .h 头文件 .o 目标文件 .a 存档文件 2、GCC常用选项 -c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件; -Dmacro定义指定的宏,使它能够通过源码中的#ifdef进行检验 #define -static 指定程序编译时采用静态编译的方法; -E 不经过编译预处理程序的输出而输送至标准输出; -g获得有关调试程序的详细信息,它不能与-o选项联合使用; -Idirectory在包含文件搜索路径的起点处添加指定目录; -llibrary提示链接程序在创建最终可执行文件时包含指定的库; -O、-O2、-O3将优化状态打开,该选项不能与-g选项联合使用; -S要求编译程序生成来自源代码的汇编程序输出; -v启动所有警报; -Wall发生警报时取消编译操作,即将警报看作是错误; -Werror在发生警报时取消编译操作,即把报警当作是错误; -w 禁止所有的报警。 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。

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

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

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 出现在主文件中

GCC编译选项

Linux中gcc,g++常用编译选项 -x language filename 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定,C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀名是. pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。可以使用的参数有下面的这些: `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a ssembler-with-cpp'. 看到英文,应该可以理解的。 例子用法: cd.. gcc -x c hello.pig -x none filename 关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型 例子用法: gcc -x c hello.pig -x none hello2.c -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他将生成.o的obj文件 -S 只激活预处理和编译,就是指把文件编译成为汇编代码。 例子用法 gcc -S hello.c 他将生成.s的汇编代码,你可以用文本编辑器察看 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. 例子用法: gcc -E hello.c > pianoapan.txt gcc -E hello.c | more 慢慢看吧,一个hello word 也要预处理成800行的代码 -o 制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感,改掉它,哈哈 例子用法 gcc -o hello.exe hello.c (哦,windows用习惯了) gcc -o hello.asm -S hello.c -pipe 使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题 gcc -pipe -o hello.exe hello.c

常见gcc 编译错误整理

常见gcc 编译错误整理(开始)1 1 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 a backslash/newline sequence. c/c++代码的每一行后面有一个“结束符”,也就是newline。避免当被include的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。 2、warning: comparison between pointer and integer 解释:integer与pointer比较

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

arm-linux-gcc常用参数讲解gcc编译器使用方法 我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。 在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段: 1. 预处理(Pre-Processing) 2. 编译(Compiling) 3. 汇编(Assembling) 4. 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。 以文件example.c为例说明它的用法 0. arm-linux-gcc -o example example.c 不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。 -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出 a.out 1. arm-linux-gcc -c -o example.oexample.c -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件 去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以 2.arm-linux-gcc -S -o example.sexample.c -S参数将对源程序example.c进行预处理、编译,生成example.s文件 -o选项同上 3.arm-linux-gcc -E -o example.iexample.c -E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上) 就是将#include,#define等进行文件插入及宏扩展等操作。 4.arm-linux-gcc -v -o example example.c 加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。 5.arm-linux-gcc -g -o example example.c -g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。 6.arm-linux-gcc -Wall -o example example.c -Wall选项打开了所有需要注意的警告信息,像在声明之前就使用的函数,声明后却没有使用的变量等。 7.arm-linux-gcc -Ox -o example example.c -Ox使用优化选项,X的值为空、0、1、2、3 0为不优化,优化的目的是减少代码空间和提高执行效率等,但相应的编译过程时间将较长并占用较大的内存空间。 8.arm-linux-gcc -I /home/include -o example example.c -Idirname: 将dirname所指出的目录加入到程序头文件目录列表中。如果在预设系统及当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。 9.arm-linux-gcc -L /home/lib -o example example.c

最新GCC编译器选项及优化提示

G C C编译器选项及优 化提示

GCC编译器选项及优化提示 GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径; 因此献上此帖,以供各位玩家参考,绝对原创噢 = 大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。 如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。 一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。 一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了! 另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure 脚本会使用这两个环境变量代替Makefile文件中的值。 但是少数configure脚本并不这样做,他们必须需要手动编辑才行。 为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值): export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS 这是一个确保能够在几乎所有平台上都能正常工作的最小设置。

"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行), Intel通常是: pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium- m,prescott,nocona 说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu; prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋) AMD通常是:k6,k6-2,k6-3,athlon,athlon-tbird,athlon-xp,athlon-mp,opteron,athlon64,athlon-fx 用AMD的一般都是DIYer,就不必解释了吧。 如果编译时没有抱怨"segmentation fault,core dumped",那么你设定的"-O"优化参数一般就没什么问题。 否则请降低优化级别("-O3"-"-O2"-"-O1"-取消)。 个人意见:服务器使用"-O2"就可以了,它是最安全的优化参数(集合);桌面可以使用"-O3"; 不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时"-O3"反而更慢)。 编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。 所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。

gcc命令行详解

gcc命令行详解 1、gcc包含的c/c++编译器 gcc、cc、c++、g++ gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为test的程序 -o参数用来指定生成程序的名字 3、为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm 4、-l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?-lname,在连接时,装载名字为“libname.a”的函数库:-lm表示连接名为“libm.a”的数学函数库。就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件) 放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是 -L/aaa/bbb/ccc -ltest 另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.s o.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so, 如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx 库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了 ln -s libxxxx-x.x.x.so libxxxx.so 手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如 gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出"- L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic

vi编辑器及GCC编译器的使用

实验三vi编辑器及GCC编译器的使用 【实验目的】 一、掌握文本编辑器vi的使用方法 二、了解GNU gcc编译器 三、掌握使用GCC编译C语言程序的方法 【实验内容】 一、vi的三种工作模式: 1、命令模式:执行相关文本编辑命令 2、输入模式:输入文本 3、末行模式:实现查找、替换、保存、多文件操作等等功能 二、进入vi,直接在Shell提示符下键入vi [文件名称],如果该文件在当前目录不存在,则vi创建之。 三、退出vi 1、在命令模式下输入“:wq”,保存文件并退出vi 2、若不需要保存文件,输入“:q” 3、若文件已修改,但不保存,输入“:q!”强制退出vi 4、其它一些不常用的方法在此省略。 四、命令模式下的常用编辑命令 1、启动vi后,进入的是vi的命令模式 2、按i键,进入输入模式,可以进行文本的编辑,在输入模式下,按esc 键,可切换回命令模式 i:光标位置不变,可在光标左侧插入正文 a:光标位置向后退一格,可在光标左侧插入正文 o:在光标所在行的下一行增添新行 O:在光标所在行的上一行增添新行 I:光标跳到当前行的开头 A:光标跳到当前行的末尾 3、光标的移动 k、j、h、l分别等同于上、下、左、右箭头键 Ctrl+b,向上翻一页 Ctrl+f,向下翻一页 nH,将光标移到屏幕的第n行 nL,将光标移到屏幕的倒数第n行 4、删除文本 nX,删除光标所指向的前n个字符 D,删除光标右侧的所有字符(包括光标所指向的字符) db,删除光标左侧的全部字符 ndd,删除当前行和当前行以后的n行内容 5、粘贴和复制 p,将缓冲区的内容粘贴到当前字符的右侧

P,将缓冲区的内容粘贴到当前字符的左侧 yy,复制当前行到内存缓冲区 nyy,复制n行内容到内存缓冲区 6、搜索字符串 /str1,正向搜索字符串str1 n,继续搜索 ?str2,反向搜索字符串str2 7、撤销和重复 u,撤销前一条命令的执行结果 .,重复最后一条命令 五、末行模式下的命令 :n,将光标移动到第n行 :nw file,将第n行写入file文件 :n,mw file,将第n行至第m行写入file文件 :w,将编辑的内容写入原始文件 :wq,将编辑的内容写入原始文件并退出编辑程序 :w file,将编辑的内容写入file文件,保持原有文件的内容不变 :f file,将当前文件重命名为file :e file,编辑新文件file代替原有内容 :f,打印当前文件的状态,如文件的行数,光标所在的行号等 :!<命令>,执行相应shell命令 六、三种工作模式的切换 1、在Linux shell下,键入vi或vi <文件名>进入命令模式 2、在命令模式下,键入:进入末行模式 3、在命令模式下,键入文本编辑命令如i,a,o等进入文本输入模式 4、在文本输入模式下,按esc键进入命令模式 5、在末行模式下,按backspace键或del键进入命令模式 6、在末行模式下,键入q或wq,退出vi,饭后到Linux shell下 GCC编译器的使用 一、使用vi或其它文本编辑器,输入C语言程序,并保存为test.c 二、在Linux shell下,输入命令gcc –o test test.c 三、编译正确后,输入命令./test运行程序,观察程序运行结果 四、若编译错误,根据提示信息,进入程序查错,再回到第二步,直至程序 语法无误。 附:GCC使用方法和常用选项 使用GCC编译C程序生成可执行文件需要经历4个步骤: 1、预处理,这一步需要分析各种命令,如#define、#include、#ifdef 等。Gcc调用cpp程序来进行预处理 2、编译,这一步将根据输入文件产生汇编语言,gcc调用ccl进行编 译工作

常见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编译器 CFLAGS 标志参数说明

gcc编译器 CFLAGS 标志参数说明2012-11-14 15:10:28 分类:LINUX CFLAGS = -g -O2 -Wall -Werror -Wno-unused 编译出现警告性错误unused-but-set-variable,变量定义但没有使用,解决方法: 增加CFLAGS 或CPPFLAGS参数如下: CPPFLAGS=" -Werror -Wno-unused-but-set-variable" || exit 1 Gcc总体选项列表 后缀名所对应的语言 -S只是编译不汇编,生成汇编代码 -E只进行预编译,不做其他处理 -g在可执行程序中包含标准调试信息 -o file把输出文件输出到file里 -v打印出编译器内部编译各过程的命令行信息和编译器的版本 -I dir在头文件的搜索路径列表中添加dir目录 -L dir在库文件的搜索路径列表中添加dir目录 -static链接静态库 -llibrary连接名为library的库文件 ·“-I dir” 正如上表中所述,“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。由于Linux 中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。 比如在“/root/workplace/Gcc”下有两个文件: #include int main() { printf(“Hello!!\n”); return 0; } #include

这样,就可在Gcc命令行中加入“-I”选项: [root@localhost Gcc] Gcc hello1.c –I /root/workplace/Gcc/ -o hello1 这样,Gcc就能够执行出正确结果。 小知识 在include语句中,“<>”表示在标准路径中搜索头文件,““”” 表示在本目录中搜索。故在上例中,可把hello1.c的“#include” 改为“#include “my.h””,就不需要加上“-I”选项了。 ·“-L dir” 选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。 例如有程序hello_sq.c需要用到目录“/root/workplace/Gcc/lib”下的一个动态库 libsunq.so,则只需键入如下命令即可: [root@localhost Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq 需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在 路径中包含文件名。 另外值得详细解释一下的是“-l”选项,它指示Gcc去连接库文件libsunq.so。由于在Linux 下的库文件命名时有一个规定:必须以lib三个字母开头。因此在用-l选项指定链接的库 文件名时可以省去lib三个字母。也就是说Gcc在对”-lsunq”进行处理时,会自动去链接 名为 libsunq.so的文件。 (2)告警和出错选项 Gcc的告警和出错选项如表3.8所示。 Gcc总体选项列表 选项含义 -ansi 支持符合ANSI标准的C程序 -pedantic 允许发出ANSI C标准所列的全部警告信息 -pedantic-error 允许发出ANSI C标准所列的全部错误信息 -w 关闭所有告警 -Wall 允许发出Gcc提供的所有有用的报警信息 -werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程 下面结合实例对这几个告警和出错选项进行简单的讲解。 如有以下程序段: #include void main() { long long tmp = 1; printf(“This is a bad code!\n”);

gcc编译器使用说明

要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器。首先,我们介绍如何在命令行方式下使用编译器编译简单的C源代码。然后,我们简要介绍一下编译器究竟作了那些工作,以及如何控制编译过程。我们也简要介绍了调试器的使用方法。 GCC rules 你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什么?可能会加入各种后门和木马。Ken Thompson是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门和永久的木马。请到这里阅读他对这个杰作的描述。幸运的是,我们有了gcc。当你进行 configure; make; make install 时, gcc在幕后做了很多繁重的工作。如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏,不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要做些什么,按什么顺序做。我们将看看如何编译C程序,以及如何使用编译选项让gcc按照我们的要求工作。步骤(以及所用工具)如下:预编译 (gcc -E),编译 (gcc),汇编 (as),和连接 (ld)。 开始... 首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个著名的第一个C程序开始。(各位老前辈,请原谅我)。 #include int main() { printf("Hello World!\n"); } 把这个文件保存为 game.c。你可以在命令行下编译它: gcc game.c 在默认情况下,C编译器将生成一个名为 a.out 的可执行文件。你可以键入如下命令运行它:a.out Hello World 每一次编译程序时,新的 a.out 将覆盖原来的程序。你无法知道是哪个程序创建了 a.out。

gcc的几个妙用

gcc的几个妙用 gcc的学习在C接触到linux以后就开始不断的学习, 也知道了一些基本的用法,但是关于gcc的使用还是有 很多值得我们加深的地方。gcc 只是一个编译工具而已。也就相当于我们在windows环境下的visual c++等一样,区别是visual c++是基于IDE的,而gcc是这些IDE的 基础。学习linux程序设计必然会学习gcc。 gcc实质是完成程序的编译和链接,程序的编译是指从 一种文件类型转换到另一种文件类型的过程。一个C语 言程序转换为可执行程序的基本步骤如下: 1、编写程序(vi,emacs等软件) 2、程序预编译(cpp) 3、编译成汇编程序(cc) 4、汇编程序(as) 5、链接程序(ld) 其中的这些过程都已经被gcc包含,我们在实际的编译 过程中采用了gcc main.c -o main.exe即可实现一个程序的编译和链接。并不需要一步一步的实现,但是我们 在分析的过程中又必须注意一个C语言文件的处理过程 以及相应的处理程序。 关于gcc的基本含义用法就不再详细的说明了,我觉得

最简单的使用方法是通过软件的help学习软件。 [gong@Gong-Computer test]$ gcc --help Usage: gcc [options] file... Options: -pass-exit-codes Exit with highest error code from a phase --help Display this information --target-help Display target specific command line options --help={target|optimizers|warnings|params|[^]{joi ned|separate|undocumented}}[,...] Display specific types of command line options (Use '-v --help' to display command line options of sub-processes) --version Display compiler version information -dumpspecs Display all of the built in spec strings -dumpversion

相关文档
最新文档