gcc的几个妙用

合集下载

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的基本⽤法使⽤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命令及用法

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用法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 参数详解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使⽤及参数说明通常所说的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基本用法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经典案例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可以进行交叉编译,即在一台主机上编译适用于另一种体系结构的程序。

gcc编译

gcc编译

gcc编译GCC(GNU Compiler Collection)是一组开放源码的编译器,它是GNU工程最重要的组成部分,用于编译C、C++、Objective-C、Fortran、Java、Ada和Go语言等。

GCC是一种非常流行的编译器,它支持多种操作系统,包括Linux、FreeBSD、Mac OS X和Windows 等。

GCC的优点1. 功能强大:GCC支持多种语言,可以用来编译C、C++、Objective-C、Fortran、Java、Ada和Go等多种编程语言,并且支持多种操作系统,比如Linux、FreeBSD、Mac OS X 和Windows等。

2. 稳定性好:GCC是一个稳定的编译器,它的源代码经过多年的维护和改进,已经可以支持多种编程语言和多种操作系统,而且它的稳定性也得到了很多开发者的认可。

3. 免费开源:GCC是一个开源的编译器,它的源代码可以免费获取,而且可以自由使用,这样就可以节省很多开发成本。

4. 可移植性好:GCC可以在多种操作系统上运行,它可以跨平台编译,这样就可以节省很多移植成本。

5. 支持多种硬件:GCC可以支持多种硬件,可以在不同的硬件上运行,这样就可以充分利用硬件的性能。

GCC的缺点1. 编译速度慢:GCC的编译速度比其他编译器慢,这是由于它支持的语言和操作系统多,所以编译的时候需要做很多兼容性处理,所以编译速度比较慢。

2. 代码调试困难:GCC支持多种语言,但是它的调试功能不够强大,代码调试比较困难,而且很多时候还需要使用其他工具来完成调试工作。

3. 版本更新较慢:GCC的版本更新较慢,因为它支持的语言和操作系统多,所以每次版本更新都需要做大量的兼容性处理,所以更新速度比较慢。

总的来说,GCC是一款功能强大、稳定性好、免费开源、可移植性好和支持多种硬件的编译器,但是它的编译速度慢、代码调试困难和版本更新慢等缺点也不容忽视。

gcc编译指令及其用途

gcc编译指令及其用途

gcc编译指令及其用途一、引言在软件开发过程中,编译是一项重要的工作。

编译器是将高级语言转换为低级语言的工具,其中gcc是一款常用的编译器。

本文将介绍gcc编译指令及其用途,帮助读者更好地理解和使用gcc。

二、gcc编译指令1. gccgcc是GNU Compiler Collection的简称,是一款功能强大的编译器。

它可以编译多种语言,如C、C++、Objective-C等。

gcc编译指令的基本格式为:gcc [选项] [文件名]2. -o-o选项用于指定输出文件的名称。

例如:gcc -o output_file input_file.c该命令将编译并生成名为output_file的可执行文件。

3. -c-c选项用于编译源文件,生成目标文件而不进行链接操作。

例如:gcc -c input_file.c该命令将生成名为input_file.o的目标文件。

4. -Wall-Wall选项用于开启所有警告信息。

编译器会输出所有可能会出现问题的警告信息,帮助程序员发现潜在的错误。

例如:gcc -Wall input_file.c该命令将编译并输出所有警告信息。

5. -g-g选项用于在可执行文件中包含调试信息。

这对于程序的调试非常有用。

例如:gcc -g input_file.c -o output_file该命令将编译并生成带有调试信息的可执行文件output_file。

6. -I-I选项用于指定头文件的搜索路径。

例如:gcc -Iinclude_dir input_file.c -o output_file该命令将编译并指定头文件的搜索路径为include_dir。

7. -L-L选项用于指定库文件的搜索路径。

例如:gcc -Llib_dir input_file.c -o output_file -lmylib该命令将编译并指定库文件的搜索路径为lib_dir,并链接名为mylib的库文件。

8. -D-D选项用于定义宏。

gcc概述

gcc概述

gcc概述GCC(GNU Compiler Collection)是一套由自由软件基金会(Free Software Foundation,FSF)开发和维护的编译器工具集。

它是一个包含多种编程语言支持的工具集,最为著名的是用于C、C++和Fortran 等语言的编译器。

以下是GCC的一些主要特点和概述:1.多语言支持:GCC支持多种编程语言,包括但不限于C、C++、Fortran、Ada、Objective-C、Objective-C++、Java和Go等。

这使得它成为一种广泛用于跨平台开发的工具集。

2.跨平台:GCC可在多种计算平台上运行,包括Unix、Linux、Windows、macOS等。

这使得开发人员能够在不同的操作系统上使用相同的工具进行编程。

3.模块化:GCC采用模块化的设计,将编译器的不同组件拆分为独立的模块,例如前端、优化器和后端。

这样的设计使得用户能够根据需要选择或更改其中的某个组件。

4.开源:GCC是自由软件,遵循GNU通用公共许可证(GPL)的规定。

这意味着用户可以自由地查看、修改和分发GCC的源代码。

5.丰富的优化选项:GCC提供了许多优化选项,允许程序员根据目标平台和性能需求调整编译器的行为,以生成更有效率的机器代码。

6.支持标准:GCC遵循各种编程语言的国际标准,例如ISO C、ISO C++等。

这确保了生成的代码与标准兼容,提高了代码的可移植性。

7.生态系统:由于GCC是一个开放源代码项目,因此有一个庞大的用户和贡献者社区。

这导致了一个活跃的生态系统,包括了丰富的文档、在线资源、插件和支持工具。

GCC的灵活性、可移植性和丰富的功能使其成为许多开发者的首选编译器。

它在开源社区和商业项目中都有广泛的应用。

gcc的用法

gcc的用法

gcc的用法
gcc是一种编译器,用于将C或C++等源代码编译为可执行文件。

下面是gcc的一些常用用法:
1. 编译单个源文件并生成可执行文件:
`gcc source.c -o executable`
2. 编译多个源文件并生成可执行文件:
`gcc source1.c source2.c -o executable`
3. 指定包含的头文件目录:
`gcc source.c -o executable -I /path/to/header`
4. 指定链接的库文件:
`gcc source.c -o executable -L /path/to/library -l libraryname`
5. 生成调试信息的可执行文件:
`gcc source.c -o executable -g`
6. 优化编译的可执行文件:
`gcc source.c -o executable -O3`
7. 编译时输出警告信息:
`gcc source.c -o executable -Wall`
8. 指定编译目标平台:
`gcc source.c -o executable -march=arch_name`
9. 生成静态库文件:
`gcc -c source.c -o objectfile.o`
`ar rcs libname.a objectfile.o`
这些只是gcc的一些常见用法示例,gcc还有许多其他选项和功能可供使用。

更详细的信息可以通过gcc的帮助文档或官方文档进行了解。

Linux命令高级技巧使用gcc命令进行CC编译和链接

Linux命令高级技巧使用gcc命令进行CC编译和链接

Linux命令高级技巧使用gcc命令进行CC编译和链接Linux命令高级技巧:使用gcc命令进行C/C++编译和链接在Linux系统中,gcc是一种非常强大和常用的编译器,可以用于编译和链接C/C++程序。

本文将介绍一些gcc命令的高级技巧,以帮助读者更有效地使用gcc进行编译和链接。

1. 检查gcc版本要使用gcc命令,首先需要确保gcc已经正确安装在系统中。

可以使用以下命令检查gcc版本:```gcc --version```该命令会显示gcc的版本信息,以确保安装的gcc版本符合要求。

2. 编译单个源文件使用gcc编译单个源文件非常简单,只需使用以下命令:```gcc -o output_filename source_filename```其中,output_filename是编译生成的可执行文件的名称,source_filename是需要编译的源文件的名称。

例如,要编译名为`hello.c`的源文件并生成可执行文件`hello`,可以使用以下命令:```gcc -o hello hello.c```编译成功后,可以通过运行`./hello`命令执行生成的可执行文件。

3. 编译多个源文件对于包含多个源文件的项目,需要将多个源文件一起编译。

下面是一个示例命令:```gcc -o output_filename source_file1 source_file2 ... source_fileN```在这个命令中,只需将所有需要编译的源文件按顺序列出即可。

例如,要编译名为`main.c`和`helper.c`的两个源文件并生成可执行文件`program`,可以使用以下命令:```gcc -o program main.c helper.c```4. 自动编译所有源文件如果项目中的源文件比较多,手动编译每个源文件将会非常繁琐。

可以使用Makefile文件来自动编译所有源文件。

以下是一个简单的Makefile示例:```CC=gccCFLAGS=-call: programprogram: main.o helper.o$(CC) main.o helper.o -o programmain.o: main.c$(CC) $(CFLAGS) main.chelper.o: helper.c$(CC) $(CFLAGS) helper.cclean:rm -rf *.o program```在这个Makefile中,`CC`变量指定了编译器,`CFLAGS`变量指定了编译选项。

gcc的使用方法

gcc的使用方法

编译:第一步、是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:gcc -E hello.c -o hello.i预处理的宏定义插入到hello.i中第二步、是将hello.i编译为目标代码,这可以通过使用-c参数来完成:gcc -c hello.i -o hello.o也可以通过源文件直接生成gcc -c hello.c第三步、是将生成的目标文件链接成可执行文件:gcc hello.o -o hello也可以通过源文件直接生成gcc -o hello hello.c警告:1、-pedantic 选项,那么使用了扩展语法的地方将产生相应的警告信息2、-Wall 使用它能够使GCC产生尽可能多的警告信息3、-Werror,它要求GCC将所有的警告当成错误进行处理库依赖:1、Linux下的大多数函数都默认:头文件放到/usr/include/目录下而库文件则放到/usr/lib/目录下2、GCC在编译时必须有自己的办法来查找所需要的头文件和库文件。

-I选项可以向GCC的头文件搜索路径中添加新的目录。

例如,如果在/home/xiaowp/include/目录下有编译时所需要的头文件,为了让GCC能够顺利地找到它们,就可以使用-I选项:gcc -o test test.c -I /home/xiaowp/include-L选项向GCC的库文件搜索路径中添加新的目录例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so,为了让GCC 能够顺利地找到它,可以使用下面的命令gcc -o test test.c -L /home/xiaowp/lib -lfoo值得好好解释一下的是-l选项,它指示GCC去连接库文件libfoo.so。

Linux下的库文件在命名时有一个约定,那就是应该以lib三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-l选项指定链接的库文件名时可以省去lib三个字母,也就是说GCC在对-lfoo进行处理时,会自动去链接名为libfoo.so的文件。

腾科IT教育:不常见但是很有用的gcc命令行选项

腾科IT教育:不常见但是很有用的gcc命令行选项

不常见但是很有用的gcc命令行选项软件工具通常情况下会提供多个功能以供选择,但是如你所知的,不是所有的功能都能被每个人用到的。

公正地讲,这并不是设计上的错误,因为每个用户都会有自己的需求,他们只在他们的领域内使用该工具。

然而,深入了解你所使用的工具也是很有益处的,因为你永远不知道它的某个功能会在什么时候派上用场,从而节省下你宝贵的时间。

举一个例子:编译器。

一个优秀的编程语言编译器总是会提供极多的选项,但是用户一般只知道和使用其中很有限的一部分功能。

更具体点来说,比如你是C 语言开发人员,并将Linux 作为你的开发平台,那么你很有可能会用到gcc编译器,这个编译器提供了(几乎) 数不清的命令行选项列表。

你知道,你可以让gcc保存每个编译阶段的输出吗?你知道用于生成警告的-Wall 选项,它并不会包含一些特殊的警告吗?gcc的很多命令行选项都不会经常用到,但是它们在某些特定的情况下会变得非常有用,例如,当你在调试代码的时候。

所以在本文中,小编会介绍这样的几个选项,提供所有必要的细节,并通过简单易懂的例子来解释它们。

本文中所有的例子所使用的环境基于Ubuntu 16.04 LTS 操作系统,gcc版本为5.4.0。

在每个编译阶段查看中间代码的输出你知道在通过gcc编译c 语言代码的时候大体上共分为四个阶段吗?分别为预处理->编译->汇编->链接。

在每个阶段之后,gcc都会产生一个将移交给下一个阶段的临时输出文件。

但是生成的都是临时文件,因此我们并不能看到它们——我们所看到的只是我们发起编译命令,然后它生成的我们可以直接运行的二进制文件或可执行文件。

但是比如说在预处理阶段,如果调试时需要查看代码是如何进行处理的,你要怎么做呢?好消息是gcc编译器提供了相应的命令行选项,你可以在标准编译命令中使用这些选项获得原本被编译器删除的中间文件。

我们所说的选项就是-save-temps。

以下是gcc手册中对该选项的介绍:永久存储临时的中间文件,将它们放在当前的文件夹下并根据源文件名称为其命名。

gcc 编译代码

gcc 编译代码

gcc 编译代码介绍gcc (GNU Compiler Collection) 是一个开源的编译器套件,它支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada和Go等。

gcc 是一个非常强大和灵活的编译器,被广泛用于开发各种类型的软件和应用程序。

gcc 的优势gcc 作为一个成熟的编译器,具有以下一些重要的优势: 1. 开源:gcc 是自由软件,任何人都可以查看和修改其源代码。

这使得gcc具有高度的可定制性,并且可以根据用户的需求进行自定义配置。

2. 跨平台:gcc 可以在多种操作系统上运行,包括Linux、Windows、Mac等。

这意味着开发人员可以在不同的平台上使用相同的编译器进行开发和调试。

3. 高度优化:gcc 提供了多种优化选项,可以根据目标平台和性能需求进行编译优化。

这些优化可以显著提高程序的执行速度和效率。

4. 多语言支持:gcc 支持多种编程语言,使得开发人员可以在同一个编译器环境中使用不同的语言进行开发。

这样可以提高开发效率,并且方便不同语言之间的交互和调用。

5. 标准兼容性:gcc 遵循多种编程语言的标准规范,如C99、C++11等。

这样可以确保编译出的程序在不同平台上具有良好的兼容性。

gcc 编译步骤gcc 编译代码的过程可以分为四个主要步骤:预处理、编译、汇编和链接。

下面将详细介绍每个步骤的作用和具体实现。

1. 预处理预处理是在编译之前对源代码进行处理的一个阶段。

在这个阶段,gcc 会执行以下操作: - 删除注释:将源代码中的注释删除,以减少后续处理的复杂性。

- 处理宏定义:将源代码中的宏定义展开,并进行参数替换。

- 处理条件编译:根据条件编译指令,选择性地包含或排除特定的代码段。

- 处理头文件包含:将源代码中的头文件包含语句展开,将头文件的内容插入到相应的位置。

2. 编译编译是将预处理后的代码转换为汇编代码的过程。

在这个阶段,gcc 会执行以下操作: - 词法分析:将源代码分解为基本的词法单元,如关键字、标识符、运算符等。

用GCC编译链接程序--编译链接器GCC常用功能

用GCC编译链接程序--编译链接器GCC常用功能

用GCC编译链接程序--编译链接器GCC常用功能一,GCC编译器简介GCC是Linux平台下常用的编译链接器。

编译链接的过程分为:源代码-->预处理文件(.i)-->编译后的汇编代码(.s)-->汇编后的二进制文件(.o)-->链接后的二进制物件(无后缀)。

处理程序分别是:cpp、ccl、as、ld。

使用 -v选项,可以看到各个阶段关联的处理程序。

使用gcc -E 指示gcc对源代码进行预处理,结果直接输出到终端。

使用gcc -S 指示gcc编译成为汇编语言使用gcc -c 指示gcc直至形成二进制文件(不进行链接)使用gcc 指示gcc链接形成二进制物件(多个二进制模块链接形成大的模块或者可执行程序)因此你需要的目标文件的种类是-E、-S、-c或者不带这些参数确定的,源文件可以是中间文件的一种。

-o参数控制的仅仅是输出文件的名称。

但是gcc默认会根据源文件的后缀去判断应该调用处理程序的那些。

例如源文件的后缀是.c,则gcc -E使用的是cpp,gcc -c则使用cpp、ccl、as。

如果源文件的后缀是.o,则gcc -E 是无法进行的,会报错:linker input file unused because linking not done。

这是gcc 发现这个应该进行链接,但是选项指示不使用linker程序,因而报这种错误信息。

如果源文件是二进制的文件,但是保存的源文件后缀却是.c,则gcc会当作这是.c文件,如果采用gcc不带参数,则gcc会很多错,因为它把这个文件当作源代码处理的。

注意:这里,源文件指的是gcc的输入文件,源代码指的是程序源代码文件。

以下是使用gcc 不带-E、-S、-c这些参数时,将会进行的处理与输入文件后缀(类型)的对应关系。

使用-save-temps可以保存编译各个阶段的临时文件。

<![endif]-->二,GCC常用编译选项格式为:gcc [option | filename] .......gcc的命令可以分为如下几类:1,全局选项 -c,-S,-E ,-o2,目录选项 -Ipath,-Lpath3,链接选项 -shared,-llibrary -Wl option4,警告选项-Wall,-Wextra,-Wconversion,-Wshardow,-Wcast-qual5,调试选项 -g ,-ggdb6,优化选项 -O, -O0,-O1,-O2,-O37,其它选项 -fPIC部分选项简介:-Wl,option : 传递 option 给链接程序-Wl,-Bstatic : 明确限定链接静态库 ( 链接程序将不再接受动态链接库,直到再次指定 -Bdynamic)-Wl,-Bdynamic : 明确限定链接动态库-fPIC : 生成动态链接用位置无关代码(Position-independent code)-shared : 生成动态链接目标文件-L : 指定链接阶段链接库所在路径-l : 指定要链接的库(原库名去除前缀“lib ”和后缀“ .a/.so ”的剩余部分)a)目录选项目录选项是为编译器指定搜索头文件和库文件所在目录的,编译时,头文件的搜索顺序为:-Ipath指定--------->环境变量C_INCLUDE_PATH或者CPLUS_INCLUDE_PATH--------->/usr/local/include和/usr/include库文件搜索顺序:-Lpath指定-------->环境变量LIBRARY_PATH----------->/usr/local/lib和/usr/lib。

gcc的高级特性

gcc的高级特性

gcc的高级特性gcc的高级特性?002、预处理#define 可以支持不定数量的参数。

例子如下:#define err(...) fprintf(stderr,__VA_ARGS__)err("%s,%d\r\n","The error code:",48);扩展为:fprintf(stderr,"%s,%d\r\n","The error code:",48);gcc的命令行参数“-E”的作用是,只执行预处理,并不执行编译和链接。

命令行参数“-M”则对一个源代码生成makefile中使用的目标,依赖规则,这个也是预处理程序(cpp)做的。

所以我们为了获得目标,依赖规则可以调用“gcc -E -M main.c”__USER_LABEL_PREFIX__是编译器内部定义的一个宏,用于作为汇编语言符号的前缀,视不同的系统而定,通常使用"_"字符。

3、C语言编译gcc能够自动分析源代码文件的扩展名(.c),可以直接将源代码文件编译成可执行文件。

“-c”选项则指定gcc将源代码文件编译成二进制文件(objective file)。

如果源代码文件的扩展名不是".c",则使用"-x"选项指定。

gcc的"-aux-info"选项可根据源代码文件生成包含函数原型声明的头文件(.h)。

例如:gcc hello.c -aux-info hello.hgcc *.c -aux-info hello.h #根据当前目录下的所有C源代码文件中的函数,生成函数原型声明头文件hello.h。

(1)、GCC中的C语言扩展使用"-pedantic"选项,gcc在编译带有gnu c语言扩展的源代码的时候会发出警告,可以在源代码的扩展表达前使用“__extension__.”关键字,禁止发出警告。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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从上面的代码就知道了基本的汇编形式,当然也可以自己设计,但是该选项简化了汇编语言的设计。

相关文档
最新文档