gcc的几个妙用
gcc使用大全

1、用于linux系统下编程的编译器概述GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU 开发的编程语言编译器。
它是一套GNU编译器套装以GPL 及LGPL 许可证所发行的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器。
GCC 原名为GNU C 语言编译器,因为它原本只能处理C语言。
GCC 很快地扩展,变得可处理C++。
之后也变得可处理Fortran、Pascal、Objective-C、Jav a, 以及Ada与其他语言。
历史GCC是由理查德·马修·斯托曼在1985年开始的。
他首先扩增一个旧有的编译器,使它能编译C,这个编译器一开始是以Pastel语言所写的。
Pastel是一个不可移植的Pascal语言特殊版,这个编译器也只能编译Pastel语言。
为了让自由软件有一个编译器,后来此编译器由斯托曼和Len Tower在1987年以C语言重写并成为GNU 专案的编译器。
GCC的建立者由自由软件基金会直接管理。
在1997年,一群不满GCC缓慢且封闭的创作环境者,组织了一个名为EGCS 〈Experimental/Enhanced GNU Compiler System〉的专案,此专案汇整了数项实验性的分支进入某个GCC专案的分支中。
EGCS比起GCC的建构环境更有活力,且EGCS最终也在1999年四月成为GCC的官方版本。
GCC目前由世界各地不同的数个程序设计师小组维护。
它是移植到中央处理器架构以及操作系统最多的编译器。
由于GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与建立其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP 与BeOS。
GCC通常是跨平台软件的编译器首选。
有别于一般局限于特定系统与执行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。
gcc的使用简介与命令行参数说明

gcc的使⽤简介与命令⾏参数说明(⼀) gcc的基本⽤法(⼆) 警告提⽰功能选项(三) 库操作选项(四) 调试选项(五) 交叉编译选项(⼀) gcc的基本⽤法使⽤gcc编译器时,必须给出⼀系列必要的调⽤参数和⽂件名称。
不同参数的先后顺序对执⾏结果没有影响,只有在使⽤同类参数时的先后顺序才需要考虑。
如果使⽤了多个 -L 的参数来定义库⽬录,gcc会根据多个 -L 参数的先后顺序来执⾏相应的库⽬录。
因为很多gcc参数都由多个字母组成,所以gcc参数不⽀持单字母的组合,Linux中常被叫短参数(short options),如 -dr 与 -d -r 的含义不⼀样。
gcc编译器的调⽤参数⼤约有100多个,其中多数参数我们可能根本就⽤不到,这⾥只介绍其中最基本、最常⽤的参数。
gcc最基本的⽤法是:gcc [options] [filenames]其中,options就是编译器所需要的参数,filenames给出相关的⽂件名称,最常⽤的有以下参数:-c只编译,不链接成为可执⾏⽂件。
编译器只是由输⼊的 .c 等源代码⽂件⽣成 .o 为后缀的⽬标⽂件,通常⽤于编译不包含主程序的⼦程序⽂件。
-o output_filename确定输出⽂件的名称为output_filename。
同时这个名称不能和源⽂件同名。
如果不给出这个选项,gcc就给出默认的可执⾏⽂件 a.out 。
-g产⽣符号调试⼯具(GNU的 gdb)所必要的符号信息。
想要对源代码进⾏调试,就必须加⼊这个选项。
-O对程序进⾏优化编译、链接。
采⽤这个选项,整个源代码会在编译、链接过程中进⾏优化处理,这样产⽣的可执⾏⽂件的执⾏效率可以提⾼,但是编译、链接的速度就相应地要慢⼀些,⽽且对执⾏⽂件的调试会产⽣⼀定的影响,造成⼀些执⾏效果与对应源⽂件代码不⼀致等⼀些令⼈“困惑”的情况。
因此,⼀般在编译输出软件发⾏版时使⽤此选项。
-O2⽐ -O 更好的优化编译、链接。
linuxgcc命令及用法

linuxgcc命令及用法Linux的gcc命令是一款非常强大的编译器,用于将源代码转换为可执行文件。
本文将详细介绍gcc命令及其常用的用法,帮助读者更好地理解和使用这款工具。
一、gcc命令的基本语法结构gcc是GNU Compiler Collection(GNU编译器集合)的简称,因此其命令基本语法结构一般为:shellgcc [选项] [输入文件]其中,选项用于指定编译时的相关参数,输入文件则是需要编译的源文件。
二、gcc命令的常用选项gcc命令提供了许多选项,用于控制编译过程及生成的可执行文件的属性。
下面是一些常用的gcc选项及其作用:1. -o:用于指定输出文件的名称。
例如,使用`-o myprogram`选项将输出文件命名为myprogram。
2. -c:仅进行编译,不进行链接操作。
这个选项常用于编译多个源文件时,先将每个源文件编译为目标文件,再进行链接操作。
3. -g:生成调试信息。
这个选项会在编译时生成与调试器兼容的调试信息,方便开发人员进行程序调试。
4. -Wall:显示所有警告信息。
使用这个选项可以使编译器在编译时输出更多的警告信息,帮助开发人员提前发现潜在的问题。
5. -I:指定头文件的搜索路径。
使用这个选项可以告诉编译器在指定的路径中查找头文件,方便引用外部库、模块等。
6. -L:指定库文件的搜索路径。
与-I选项类似,这个选项用于告诉编译器在指定的路径中查找库文件,用于链接时的库文件搜索。
7. -l:指定要链接的库文件。
使用这个选项可以显式地告诉编译器要链接的库文件,如:-lmath将链接math库文件。
三、gcc命令的应用实例下面通过几个实例来演示gcc命令的具体用法,以帮助读者更好地理解和掌握这款工具。
1. 编译单个源文件并生成可执行文件假设我们有一个名为`hello.c`的源文件,内容如下:c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}我们可以使用以下命令将其编译为可执行文件`hello`:shellgcc -o hello hello.c编译成功后,即可在当前目录下生成名为`hello`的可执行文件。
gcc用法

gcc用法gcc是GNU Compiler Collection的缩写,是一个集成的编译器系统,支持多种编程语言,包括C、C++、Objective-C、Fortran、Java等。
以下是一些常见的gcc用法:1. 编译源代码gcc main.c -o myprogram以上命令将会编译main.c文件,并生成可执行文件myprogram。
2. 编译多个源代码文件gcc file1.c file2.c -o myprogram以上命令将会编译file1.c和file2.c文件,并生成可执行文件myprogram。
3. 编译静态库gcc -c file1.c file2.car rcs libmylib.a file1.o file2.o以上命令将会编译file1.c和file2.c文件,并将它们打包成静态库libmylib.a。
4. 编译动态库gcc -shared -o libmylib.so file1.o file2.o以上命令将会编译file1.o和file2.o文件,并将它们打包成动态库libmylib.so。
5. 调试程序gcc -g main.c -o myprogram以上命令将会编译main.c文件并为其加入调试信息,从而便于程序调试。
6. 优化编译gcc -O2 main.c -o myprogram以上命令将会以O2优化等级编译main.c文件,并尝试优化生成的可执行文件。
7. 链接外部库gcc main.c -o myprogram -lm以上命令将会编译main.c文件,并链接数学库libm.a,从而使程序可以使用数学函数。
以上是一些常见的gcc用法,还有许多其它用法可以通过man gcc命令查看详细用法。
GCC用法

GCC 参数详解gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]4.连接目标代码,生成可执行程序[链接器ld][参数详解]-x language filename设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。
可以使用的参数吗有下面的这些`c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a ssembler-with-cpp'.看到英文,应该可以理解的。
例子用法: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.txtgcc -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-ansi关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inl ine typeof关键字,以及UNIX,vax等预处理宏,-fno-asm此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。
gcc使用及参数说明

gcc使⽤及参数说明通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关⼯具,所以它能把易于⼈类使⽤的⾼级语⾔编写的源代码构建成计算机能够直接执⾏的⼆进制代码。
GCC是Linux平台下最常⽤的编译程序,它是Linux平台编译器的事实标准。
同时,在Linux平台下的嵌⼊式开发领域,GCC也是⽤得最普遍的⼀种编译器。
GCC之所以被⼴泛采⽤,是因为它能⽀持各种不同的⽬标体系结构。
例如,它既⽀持基于宿主的开发(简单讲就是要为某平台编译程序,就在该平台上编译),也⽀持交叉编译(即在A平台上编译的程序是供平台B使⽤的)。
⽬前,GCC⽀持的体系结构有四⼗余种,常见的有X86系列、Arm、PowerPC等。
同时,GCC还能运⾏在不同的操作系统上,如Linux、Solaris、Windows等。
·详解GCC的下载和安装·Linux编程起步 GCC基本⽤法除了上⾯讲的之外,GCC除了⽀持C语⾔外,还⽀持多种其他语⾔,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal等。
本系列⽂章中,我们不仅介绍GCC的基本功能,还涉及到⼀些诸如优化之类的⾼级功能。
另外,我们还考察GCC的⼀些映像操作⼯具,如size和objcopy等,这将在后续的⽂章中加以介绍。
⼆、程序的编译过程对于GUN编译器来说,程序的编译要经历预处理、编译、汇编、连接四个阶段,如下图所⽰:从功能上分,预处理、编译、汇编是三个不同的阶段,但GCC的实际操作上,它可以把这三个步骤合并为⼀个步骤来执⾏。
下⾯我们以C语⾔为例来谈⼀下不同阶段的输⼊和输出情况。
在预处理阶段,输⼊的是C语⾔的源⽂件,通常为*.c。
它们通常带有.h之类头⽂件的包含⽂件。
这个阶段主要处理源⽂件中的#ifdef、 #include和#define命令。
该阶段会⽣成⼀个中间⽂件*.i,但实际⼯作中通常不⽤专门⽣成这种⽂件,因为基本上⽤不到;若⾮要⽣成这种⽂件不可,可以利⽤下⾯的⽰例命令:gcc -E test.c -o test.i在编译阶段,输⼊的是中间⽂件*.i,编译后⽣成汇编语⾔⽂件*.s 。
gcc用法

gcc基本用法gcc命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再慢慢学习其它选项,免得因选项太多而打击了学习的信心。
一. 常用编译命令选项假设源程序文件名为test.c。
1. 无选项编译链接用法:#gcc test.c作用:将test.c预处理、汇编、编译并链接形成可执行文件。
这里未指定输出文件,默认输出为a.out。
2. 选项-o用法:#gcc test.c -o test作用:将test.c预处理、汇编、编译并链接形成可执行文件test。
-o 选项用来指定输出文件的文件名。
3. 选项-E用法:#gcc -E test.c -o test.i作用:将test.c预处理输出test.i文件。
4. 选项-S用法:#gcc -S test.i作用:将预处理输出文件test.i汇编成test.s文件。
5. 选项-c用法:#gcc -c test.s作用:将汇编输出文件test.s编译输出test.o文件。
6. 无选项链接用法:#gcc test.o -o test作用:将编译输出文件test.o链接成最终可执行文件test。
7. 选项-O用法:#gcc -O1 test.c -o test作用:使用编译优化级别1编译程序。
级别为1~3,级别越大优化效果越好,但编译时间越长。
二. 多源文件的编译方法如果有多个源文件,基本上有两种编译方法:[假设有两个源文件为test.c和testfun.c]1. 多个文件一起编译用法:#gcc testfun.c test.c -o test作用:将testfun.c和test.c分别编译后链接成test可执行文件。
2. 分别编译各个源文件,之后对编译后输出的目标文件链接。
用法:#gcc -c testfun.c //将testfun.c编译成testfun.o#gcc -c test.c //将test.c编译成test.o#gcc -o testfun.o test.o -o test //将testfun.o和test.o链接成test以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。
gcc经典案例

gcc经典案例gcc(GNU Compiler Collection)是一个开源的编译器套件,支持多种编程语言,包括C、C++、Fortran、Ada等。
它是许多开发者和项目的首选编译器,被广泛应用于各种领域。
下面列举了10个经典的gcc案例,展示了gcc在不同场景下的应用。
1. 编译C程序:gcc最常见的用途是编译C程序。
可以使用gcc命令将C源代码文件编译成可执行文件,比如将hello.c编译为hello可执行文件:gcc hello.c -o hello。
2. 编译C++程序:除了C语言,gcc也支持C++。
可以使用g++命令将C++源代码文件编译成可执行文件,比如将hello.cpp编译为hello可执行文件:g++ hello.cpp -o hello。
3. 优化编译:gcc提供了多种优化选项,可以通过优化编译来提高程序的性能。
例如,使用-O2选项可以开启中级优化:gcc -O2 hello.c -o hello。
4. 调试程序:gcc支持生成带有调试信息的可执行文件,方便调试程序。
可以使用-g选项来编译程序并生成调试信息:gcc -g hello.c -o hello。
然后可以使用调试器(如gdb)来调试程序。
5. 静态库的创建和使用:gcc可以将一组相关的函数打包为静态库,方便在其他程序中使用。
可以使用-ar选项创建静态库:ar rcs libhello.a hello.o。
然后可以在其他程序中使用该静态库:gcc main.c -o main -L. -lhello。
6. 动态库的创建和使用:除了静态库,gcc还支持动态库的创建和使用。
可以使用-shared选项创建动态库:gcc -shared -o libhello.so hello.o。
然后可以在其他程序中使用该动态库:gcc main.c -o main -L. -lhello。
7. 交叉编译:gcc可以进行交叉编译,即在一台主机上编译适用于另一种体系结构的程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 --helpUsage: gcc [options] file...Options:-pass-exit-codesExit with highest error code from a phase--helpDisplay this information--target-helpDisplay 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)--versionDisplay compiler version information-dumpspecsDisplay all of the built in spec strings-dumpversionDisplay the version of the compiler-dumpmachineDisplay the compiler's target processor-print-search-dirsDisplay the directories in the compiler's search path-print-libgcc-file-name Display the name of the compiler's companion library-print-file-name=;Display the full path to library ;-print-prog-name=; Display the full path to compiler component ;-print-multi-directoryDisplay the root directory for versions of libgcc-print-multi-libDisplay the mapping between command line options andmultiple library search directories-print-multi-os-directory Display the relative path to OS libraries-print-sysrootDisplay the target libraries directory-print-sysroot-headers-suffix Display the sysroot suffix used to find headers-Wa,;Pass comma-separated ; on to the assembler-Wp,;Pass comma-separated ; on to the preprocessor -Wl,;Pass comma-separated ; on to the linker-Xassembler ;Pass ; on to the assembler-Xpreprocessor ;Pass ; on to the preprocessor-Xlinker ;Pass ; on to the linker-combinePass multiple source files to compiler at once -save-tempsDo not delete intermediate files-save-temps=;Do not delete intermediate files-no-canonical-prefixesDo not canonicalize paths when building relativeprefixes to other gcc components-pipeUse pipes rather than intermediate files-timeTime the execution of each subprocess-specs=;Override built-in specs with the contents of ; -std=;Assume that the input sources are for ;--sysroot=;Use ; as the root directory for headersand libraries-B ;Add ; to the compiler's search paths-b ;Run gcc for target ;, if installed-V ;Run gcc version number ;, if installed-vDisplay the programs invoked by the compiler -###Like -v but options quoted and commands not executed-EPreprocess only; do not compile, assemble or link-SCompile only; do not assemble or link-cCompile and assemble, but do not link-o ;Place the output into ;-x ;Specify the language of the following input filesPermissible languages include: c c++ assembler none'none' means revert to the default behavior ofguessing the language based on the file's extensionOptions starting with -g, -f, -m, -O, -W, or --param are automaticallypassed on to the various sub-processes invoked by gcc. In order to passother options on to these processes the -W; options must be used.For bug reporting instructions, please see:;.从上面的结果可以知道基本的用法。
但是还是有几个需要注意的地方,这也是我们学习gcc时不经常使用,但又非常有用的几个用法。
1、采用gcc实现预编译,预编译可以实现代码的检查,特别是宏定义的检查,通过预编译检查实际的代码是否出错,这是非常有用的检查方式。
由于预编译以后宏定义被扩展了,这时对源码的分析就能找出代码宏定义等是否存在错误,特别时一些不容易发现的错误。
基本的实现形式为:gcc -E file.c >; file.pre.c[gong@Gong-Computer Example]$ vi main.c采用重定向的方式改变输出流,便于检查错误所在。
[gong@Gong-Computer Example]$ gcc -E main.c >; main.pre.c[gong@Gong-Computer Example]$ vi main.pre.c从上面的结果可以发现我们的宏已经实现了扩展。
通过分析宏的扩展可以分析代码是否正确。
比如我将宏定义max(x,y)改写为max (x,y)就会出现下面的结果。
如下图所示。
从856行的结果我们可以知道,上面的代码并不是我们需要的情况,这说明我们的代码存在问题,从而实现了宏定义的检测。
这是非常有用的一种检测方式。
2、产生镜像文件基本的实现方法是:注意Wl逗号后面跟着需要传递的参数,逗号后面不能存在空格,否则出现错误。
gcc -Wl,-Map=file.map file.c -o target关于选项-Wl的使用可以参考help,这是我的一个截图从上面说明可以知道-Wl用于传递参数给链接器。
当然也有传递给汇编器和预编译的选项。
通过上面的选项可以得到一个镜像文件,通过打开镜像文件来程序的结构。
[gong@Gong-Computer Example]$ gcc-Wl,-Map=main.map main.c -o main.exe[gong@Gong-Computer Example]$ vi main.map上面只是其中的一部分,还有很多的内容。
其中这些内容指出了程序的基本分布情况。
3、汇编程序汇编语言是不可避免要学习的设计语言,但是很多时候并不需要完全手动的编写汇编语言,我们可以采用gcc实现一段程序的汇编形式,只需要选择正确的选项即可。
gcc -S file.c实现如下:[gong@Gong-Computer Example]$ gcc -S main.c [gong@Gong-Computer Example]$ vi main.s从上面的代码就知道了基本的汇编形式,当然也可以自己设计,但是该选项简化了汇编语言的设计。