gcc编译选项中wall的作用
‘壹’ 在linux下如何开发C程序
在Linux开发环境下,GCC是进行C程序开发不可缺少的编译工具。GCC是GNU C Compile的缩写,是GNU/Linux系统下的标准C编译器。虽然GCC没有集成的开发环境,但堪称是目前效率很高的C/C++编译器。《linux就该这么学》非常值得您一看。Linux平台下C程序开发步骤如下:
1.利用编辑器把程序的源代码编写到一个文本文件中。
比如编辑test.c程序内容如下:
/*这是一个测试程序*/
#include<stdio.h>
int main(void)
{
printf("Hello Linux!");
}
2.用C编译器GCC编译连接,生成可执行文件。
$gcc test.c
编译完成后,GCC会创建一个名为a.out的文件。如果想要指定输出文件,可以使用选项-o,命令如下所示:
$gcc-o test1 test.c
这时可执行文件名就变为test1,而不是a.out。
3.用C调试器调试程序。
4.运行该可执行文件。 在此例中运行的文件是:
$./a.out 或者 test1
结果将得出:
Hello Linux!
除了编译器外,Linux还提供了调试工具GDB和程序自动维护工具Make等支持c语言编程的辅助工具。如果想要了解GCC的所有使用说明,使用以下命令:
$man gcc
‘贰’ gcc编译选项 -w是什么意思
不同版本的动态库是为了升级方便,旧的程序需要与旧的库链接,新的程序与新的.
一般的做法是把libabc.so连接(symbolic link, ln -s libabc.so.N libabc.so)到最新的版本,这样以后的新程序,在用gcc -labc的时候,都会链接到新的版本.旧的已经链接好的程序并不会产生不兼容的问题,因为旧程序在过去已经链接过了(动态库链接的信息可以用ldd来查看: ldd /bin/ls).
symbolic link, ln是推荐的维护版本的办法,不建议更改文件名.
如果你要有一个方便的办法链接旧的版本, 建一个旧的版本的symbolic link就可以了,libabc11.so
ln -s libabc.so.11 libabc11.so
gcc -labc11...
以上回答你满意么?
‘叁’ 请问为什么我在用gcc编译c语言写的一个小程序时不能使用“wall”参数
在控制台 gcc /hello.c -o /hello.out,编译没错的话,就会在根目录出现一个hello.out的文件,然后 /hello.out,就可以看到结果了. 具体参阅GCC的用法 一.gcc历史 GCC最早是Richard Stallman在十几年前编写的针对于C的编译器,意思即为GNU C Compiler,后来发展支持Ada,C++,Java,Objective C,Pascal,COBOL,以及支持逻辑编程的Mercury语言,后来其英文原名变为:GNU Compiler ollection([1]).除此之外,GCC对于各种硬件平台都提供了完善的支持。 一般的,GCC的编译功能包括gcc(C的编译器),g++(C++的编译器),在编译过程中,一共有四步工作。 1.预处理,生成i文件,C文件编译为.i文件,C++文件编译为.ii文件,它们都为源程序的预处理结果文件.以最简单的Hello World程序为例: ********************************* // test.c #include "stdio.h" #define MAX 9 int main() { int a; a=MAX; printf("Hello Worldn"); } ********************************* 用cpp test.c test.i 可得到预处理文件test.i,通过查看该文件,我们可以看到,我们引入的include文件已经被引入处理,define定义的部分已经被完全带入。 2.预处理文件转换成汇编语言,生成.s文件。这一步利用egcs来完成(在mingw标准包中没有见到这个预编译器,所以测试没有成功,将继续测试) 3.汇编变为目标文件,生成.o文件,利用as来完成。 4.连接目标文件,生成可执行程序,利用ld来完成.(后续继续研究ld编译过程。) 二.GCC参数祥解 -x language filename 设定文件使用的语言,这样源程序的后缀名无效了,并对gcc后接的多个编译文件都有效。这样如 果存在.c和.cpp文件联编会有问题,解决这个问题用到了下一个参数 -x none filename,在下面做介绍。因为在预处理过程中对于.c和.cpp文件的处理方式是不一样的。可以使用的参数有:'c','objective- c','c-header','c++','cpp-output','assembler','assembler-with-cpp'.编译的时候, 如果有这样的一个用C语言写的test.tmp的文件,用gcc编译的时候就用gcc -x c test.tmp就可以让gcc用编译C语言的方式来编译test.tmp. -x none filename 关掉上一个选项,就是让gcc根据文件名后缀,自动识别文件类型。如用下列方式编译: gcc -x c test.tmp -x none test2.c 这样可以自由地选择编译方式 -c 只激活预处理,编译和汇编,也就是把程序做成obj文件。如gcc -c test.c 就会生成test.o文件,当然这样还只是目标文件,需要经过ld连接器对所有的.o文件进行联接才能生成可执行文件. -S 只激活预处理和编译,把文件编译到汇编代码。相当到对源程序做一个egcs操作,生成.s文件。可以查看生成的汇编文件结果。这个对于研究汇编语言的程序员来说是很有作用的。 -E 只激活预处理,这个将对文件进行预处理,将对所有引入的include文件和define定义的量进行代换,为我们开头所说的gcc 编译的第一步,即用cpp命令将程序语言文件进行预处理.但这一步不生成结果文件,如果你需要生成结果文件保存,那么需要利用系统中的输出重定向。 -o 定制目标名称,缺省的时候在unix和linux平台下gcc filename的结果是一个文件名为a.out的文件,windows下用mingw里带的gcc编译结果是a.exe。如果我们用gcc -o hello.exe test.c的话,将生成hello.exe可执行程序。这个并不一定只限于最后一步可执行程序的生成,如用上面所讲的-S生成的汇编程序也可以用-o参 数生成,比如 gcc -o hello.asm -S test.c 这样hello.asm就是test.c经过预处理和编译之后的结果。 -pipe 使用管道来代替编译中的临时文件,因为编译的整个过程有几个不同的步骤,每一个步骤都是以前一个步骤的输出为输入的,这样就涉 及到数据传递的问题,在没有-pipe参数的情况下,是用临时文件的形式来进行传递的,在有该情况的时候就利用管道来传递中间数据。当然,在某些系统中, 汇编不能读取管道数据,这样这个参数就不能正常工作了。 -ansi 关闭gnu c与ansi c不兼容的特性,激活ansi c的专有特性,在此情况下,处理器会定义一个__STRICT_ANSI__的宏,在有些头文件中会关注该宏是否被申明过,以避免某些函数的引入。此项可参照ansi c与gnu c的差别得到更多理解。 -fno-asm 此选项为ansi选项功能的一部分,禁止将asm,inline,typeof用作关键字。 -fno-strict-prototype 这个选项只对g++有作用。这个参数让编译器将所有没有参数的函数都认为是没有显式参数的个数和类型的函数,而不是没有参数。而对于gcc来说,会将没有带参数的函数认成没有显式说明的类型。 -fthis-is-variable 这个参数仅对C++程序有效,可以让this做一般变量使用,允许对this赋值. -fcond-mismatch 允许条件表达式的第二和第三参数类型不匹配.表达式的值为void型. -funsigned-char -fno-signed-char -fsigned-char -fno-unsigned-char 这四个是对char在编译时进行的设置,它们分别决定将char设为unsigned char或signed char. -include filename 加入头文件的位置,以使程序中顺利使用#include ,这样就可以在编译的时候这样编译:gcc test.c -include ./include/test.h,进行联编。 -imacros filename 将filename中的宏扩展到gcc的输入文件里,宏定义本身不会出现在输入文件中。意即在编译某个文件test.c的时候,它里面申明的宏如果在没有用到该参数的时候,生成目标文件之后就会被丢弃掉,而在用了这个参数之后,这些宏将被保留用于之后文件的编译。 -Dmacro 相当于#define macro,宏的内容为字符串'1'。如在编译的时候使用gcc -o test.exe test.c -DDEBUG就相当于在test.c里面定义了DEBUG宏,值为字串'1'。可用如下程序测试可知: ********************************** //test.c #include "stdio.h" int main() { printf("Hello Worldn"); #ifdef DEBUG printf("hellon"); #endif } ********************************** 如用gcc -o test.exe test.c编译,刚运行结果为: Hello World 如用gcc -o test.exe test.c -DDEBUG编译,则运行结果为: Hello World hello 因此可以在下一种编译方法中相当于在test.c里面定义了DEBUG宏。 -Dmacro=define 作用同上,但设定宏的值为define. -Umacro 相当于给程序中定义的宏作了一次undefine.即:#undef macro -undef 取消了对任何非标准友的定义 -Idir 在#include 的时候,先在用这个参数指定的位置找头文件,如果没有找到,则到缺省的目录找头文件 -I- 取消-Idir的作用,表明以后编译的程序将不在-Idir指定的目录里寻找头文件。 -idirafter dir 在-I的目录里面查找失败之后,再在这个目录里面查找头文件,这样的参数为设置头文件查找的优先级问题比较有帮助。 -iprefix prefix -iwithprefix dir 这两个参数一起用,在-I目录寻找失败的时候,到prefix的dir下查找头文件。 -nostdinc 编译器不再系统缺省的头文件目录里面找头文件。这样就可以精确地确定头文件的来源,应该比较慎用,在对编译器不是很了解的情况下容易造成编译失败. -nostdinc C++ 不在g++的标准路径中找头文件,但在其他的路径中继续找。在创lib的时候用。 -C 为了有效的分析程序,有预处理的时候不删除注释信息,与-E一起使用,有利用分析程序的过程。 -M 生成文件的关联的信息,这样就可以知道源代码文件里面关联了哪些它所依赖的头文件。 -MM 同上,但忽略由#include 造成的依赖关系 -MD 跟-M相当,但是输出导入到.d文件中,如gcc -MD test.c,刚输出的依赖关系存放在test.d文件里。 -MMD 跟-MM相同,但是输出到.d文件中,如gcc -MMD test.c,刚输出的依赖关系存放在test.d文件里。忽略#include 的关系 -Wa,option 这个参数将option传给汇编程序,如果option中有逗号,则会把option分成多项,传给汇编程序。 -Wl,option 这个参数将option传给连接程序,如果option中有逗号,则会把option分成多项,传给连接程序。 -llibrary 用于制定编译的时候使用的库,如 gcc -lgtk tset.c则程序使用gtk库进行编译,不过需要注意的是gcc库一般都是以libname.a来命名库文件,在用-l参数来加入库文件的时候,直接用-lname来引入,而前面的lib被省掉。这一点需要注意。 -Ldir 编译的时候设定库文件查找的路径,不然的话,编译器只在标准库路径里面找库。 -00 -01 -02 -03 编译器的优化选项,-00表示没有优化,-01为缺省值,-03为最高。 -g 在编译的时候,产生调试信息 -gstabs 以stabs格式声称调试信息,但不包括gdb的调试信息。 -gstabs+ 以stabs格式声称调试信息,包括gdb的调试信息。 -ggdb 该参数将把gdb的调试信息输出 -static 这个参数将禁止使用动态库,这样程序只能连接静态库。 -share 这个参数将让程序尽量使用动态库 -traditional 试图让编译器支持传统的C语言的特性. 三.总结 gcc的参数还远远多于上面写到的这些,但是有以上的参数我们已经可以对gcc的大部分编译掌握的比较熟练了,更多的参数介绍可以参照GCC的manual,现在已有翻译了的中文手册,地址在下面的参考文献里面被列出,有兴趣的朋友可以参考。 ~
‘肆’ gcc -c mue_mvb.c -Wall -O3 -DTCN_LE -I. 中的-DTCN_LE是什么意思查不到!请高手赐教,谢谢!
编译选项-D表示定义一个宏,-DTCN_LE的意思就是定义一个宏,宏名叫TCN_LE
‘伍’ DEV C++如何开启wall警告选项
尽管 gcc 编译器的 -Wall 选项涵盖了绝大多数警告标记,依然有一些警告不能生成。为了生成它们,请使用 -Wextra 选项。
比如,下面的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=0;
/* ...
some code here
...
*/
if(i);
return 1;
return 0;
}1234567891011121314
我不小心在 if 条件后面多打了一个分号。现在,如果使用下面的 gcc 命令来进行编译,不会生成任何警告。
gcc -Wall test.c -o test1
但是如果同时使用 -Wextra 选项来进行编译:
gcc -Wall -Wextra test.c -o test1
会生成下面这样一个警告:
test.c: In function ‘main’:
test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
if(i);123
从上面的警告清楚的看到, -Wextra 选项从内部启用了 -Wempty-body 选项,从而可以检测可疑代码并生成警告。下面是这个选项启用的全部警告标记。
-Wclobbered
-Wempty-body
-Wignored-qualifiers
-Wmissing-field-initializers
-Wmissing-parameter-type (仅针对 C 语言)
-Wold-style-declaration (仅针对 C 语言)
-Woverride-init
-Wsign-compare
-Wtype-limits
-Wuninitialized
-Wunused-parameter (只有和 -Wunused 或 -Wall 选项使用时才会启用)
-Wunused-but-set-parameter (只有和-Wunused或-Wall` 选项使用时才会生成)123456789101112
如果想对上面所提到的标记有更进一步的了解,请查看 gcc 手册。
‘陆’ linux系统下-Wall和-Werror的作用是什么
你说的是gcc的编译选项吧
-Wall 打开gcc的所有警告
-Werror,它要求gcc将所有的警告当成错误进行处理
‘柒’ 什么是GCCGCC有什么作用
GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。
GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。GCC是自由软件过程发展中的着名例子,由自由软件基金会以GPL协议发布。
GCC功能与作用:
1、预处理
命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。
2、编译
用GCC编译C/C++代码时,它会试着用最少的时间完成编译并且编译后的代码易于调试。易于调试意味着编译后的代码与源代码有同样的执行顺序,编译后的代码没有经过优化。
3、连接
当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。
4、汇编
汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。
(7)gcc编译选项中wall的作用扩展阅读:
gcc所遵循的部分约定规则:
1、.c为后缀的文件,C语言源代码文件。
2、.a为后缀的文件,是由目标文件构成的档案库文件。
3、.h为后缀的文件,是程序所包含的头文件。
4、.i 为后缀的文件,是C源代码文件且不应该对其执行预处理。
5、.m为后缀的文件,是Objective-C源代码文件。
6、.o为后缀的文件,是编译后的目标文件。
7、.s为后缀的文件,是汇编语言源代码文件。
‘捌’ gcc -Wall -static这句在单独编译一个c文件时可以在gcc后面加。那现在在一个比较复杂
写入makefile
‘玖’ linux系统中用gcc编译并且运行c程序
【希望对你有帮助】
建议你看看编程的一些基础知识
- 经典hello word 程序
#include <stdio.h>
int mian()
{
printf("hello world!
");
return 0;
}
- 编译
-进入终端
-进入源文件所在的目录
$ gcc hello.c -o hello
- 运行
$ ./hello