GCC(GNUCompilerCollection,GNU编译器套件),是由GNU开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是GNU计划的关键部分。
GCC原本作为GNU *** 作系统的官方编译器,现已被大多数类Unix *** 作系统(如Linux、BSD、MacOSX等)采纳为标准的编译器,GCC同样适用于微软的Windows。GCC是自由软件过程发展中的著名例子,由自由软件基金会以GPL协议发布。
GCC功能与作用:
1、预处理
命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。
2、编译
用GCC编译C/C++代码时,它会试着用最少的时间完成编译并且编译后的代码易于调试。易于调试意味着编译后的代码与源代码有同样的执行顺序,编译后的代码没有经过优化。
3、连接
当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。
4、汇编
汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,S为后缀的汇编语言源代码文件和汇编、s为后缀的汇编语言文件经过预编译和汇编之后都生成以o为后缀的目标文件。
扩展资料:
gcc所遵循的部分约定规则:
1、c为后缀的文件,C语言源代码文件。
2、a为后缀的文件,是由目标文件构成的档案库文件。
3、h为后缀的文件,是程序所包含的头文件。
4、i为后缀的文件,是C源代码文件且不应该对其执行预处理。
5、m为后缀的文件,是Objective-C源代码文件。
6、o为后缀的文件,是编译后的目标文件。
7、s为后缀的文件,是汇编语言源代码文件。
参考资料:
gcc常用命令行
gcc/g++在执行编译工作的时候,总共需要以下几步:
1预处理,生成i的文件[预处理器cpp]
2将预处理后的文件转换成汇编语言,生成文件s[编译器egcs]
3由汇编变为目标代码(机器代码)生成o的文件[汇编器as]
4连接目标代码,生成可执行程序[链接器ld]
/GCC能够处理的后缀有:/
a c C (C语言)
b cxx cc (C++语言)
c m (面向对象的C)
d i (预处理后的C语言源文件)
e ii (预处理后的C++语言源文件)
f s S (汇编语言)
h h (头文件)
/目标文件可以是:/
a o 编译连接后的目标文件
b a 库文件
-o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,缺省文件名是aout
-c 只编译不链接
-IDIRNAME 将DIRNAME加入到头文件的搜索目录列表中
-LDIRNAME 将DIRNAME加入到库文件的搜索目录列表中,缺省情况下gcc 只链接共享库
-lFOO 链接名为libFOO的函数库
-O 优化编译过的代码
-ON 指定代码优化的级别为N,o<=N<=3
-v 显示在编译过程的每一步中用到的命令
-x language filename 设定文件所使用的语言,使后缀名无效,对以后的多个有效也就是根据约定C语言的后缀名称是c的,而C++的后缀名是C或者cpp,
如果你很个性,决定你的C代码文件的后缀名是pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,
除非到了下一个参数的使用。例 gcc -x c hellopig
-x none filename 关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型
例:gcc -x c hellopig -x none hello2c
-c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
例:gcc -c helloc 他将生成o的obj文件
-o 制定目标名称,缺省的时候,gcc 编译出来的文件是aout,很难听,如果你和我有同感,改掉它!
例子用法
gcc -o helloexe helloc (哦,windows用习惯了)
gcc -o helloasm -S helloc
-Idir 在你是用#include”file”的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,
他回先在你所制定的目录查找,然后再按常规的顺序去找对#include,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找
-I- 就是取消前一个参数的功能,所以一般在-Idir之后使用
-idirafter dir 在-I的目录里面查找失败,讲到这个目录里面查找
-iprefix prefix
-iwithprefix dir 一般一起使用,当-I的目录查找失败,会到prefix+dir下查找
-nostdinc 使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头文件的位置
-nostdin C++ 规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,此选项在创libg++库使用
-C 在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的
-M 生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M helloc来测试一下。
-MM 和上面的那个一样,但是它将忽略由#include造成的依赖关系。
-MD 和-M相同,但是输出将导入到d的文件里面
-MMD 和-MM相同,但是输出将导入到d的文件里面
-Wa,option 此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序
-Wloption 此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会连接程序
-llibrary 制定编译的时候使用的库
例子用法 gcc -lcurses helloc 使用curses库编译程序
-Ldir 制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然编译器将只在标准库的目录找。这个dir就是目录的名称。
-O0 -O1 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-g 只是编译器,在编译的时候,产生调试信息。
-gstabs 此选项以stabs格式声称调试信息,但是不包括gdb调试信息
-gstabs+ 此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息
-ggdb 此选项将尽可能的生成gdb的可以使用的调试信息
-static 此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么动态连接库,就可以运行
-share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统有动态库
-traditional 试图让编译器支持传统的C语言特性
1、gcc t 文件名c -o 文件名
2、直接运行 o 后面的文件名即可
gcc(选项)(参数)
选项:
-o:指定生成的输出文件;
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-wall:显示警告信息;
-c:仅执行编译 *** 作,不进行连接 *** 作。
示例:
->gcc testc -o test
->test
想学好编程的话,真心推荐你使用linux,在windows下,我们都是写好程序,直接点按钮就能运行了,好像代码直接运行的一样,看是很方便,可是你不知道你错过了都是东西,程序从代码到可执行的二进制文件,要经过∶预处理、编译、汇编和链接,windows下编程你是感觉不到的,因为IDE已经在后台给你做了,可这几个步骤都是很重要的,如果理解,对你绝对有很大的帮助,但是如果你已经不是菜鸟了,请忽略我上面说的,我大学时编程也是windows下,现在工作了,公司基本都是linux的,再说现在找工作,不会linux说自己是程序员挺丢人的
你的问题我建议装个双系统吧,编程用linux,玩用windows,windows下的gcc是不可能的,即使有你遇到问题也是无解的
若要在 Mac 的终端中编译并运行 C 源代码,你首先需要安装 Command Line Tools,里面包含有 GCC 编译器。安装方法为:
打开终端,输入 gcc。
如果你没有安装 Command Line Tools,会d出一个窗口提示你安装,如图所示,点击安装即可。如果出现提示“no input files”,说明你已经安装了 gcc 编译器,可以直接开始编译程序。
安装完成后,定位至你需要编译的 C 源代码所在目录,即使用 cd 命令,例如我现在在根目录下,我的 C 代码位于 ——/Desktop/Self/C 文件夹中,我便可以在终端中输入以下命令,来跳转到我 C 代码的文件夹:
cd Desktop/Self/C
效果如图:
如果觉得输入文件夹地址比较繁琐,还有一种简单的方法,就是输完 cd 后在 Finder 中找到你的文件夹,直接把它拖到终端里,系统会自动生成这个文件夹的地址。
定位完成后,就可以开始编译了。例如,我要编译的文件叫 dotc,那么就在终端中输入
gcc -Wall -g -o dot dotc
其中,-Wall 代表编译器在编译过程中会输出警告信息(Warning),比如有些变量你并没有使用,指针指向的类型有误,main 函数没有返回整数值等。这类信息虽然不是错误,不影响编译,但是很可能是程序 bug 的源头,也有助于你寻找代码中的错误,规范代码格式。所以建议每次编译时都加上 -Wall 参数。
-g 代表编译器会收集调试(debug)信息,这样如果你的程序运行出错,就可以通过 gdb 或者 lldb 等工具进行逐行调试,方便找出错误原因。如果你不是百分之百确定你的程序毫无问题,建议加上 -g 参数。这样 debug 的时候会方便很多。
-o 代表编译器会将编译完成后的可执行文件以你指定的名称输出到你指定的文件夹下。-o 的空格后的名称就是输出的文件的名称。例如我这里 -o 后是 dot,就是说 gcc 会在编译成功后在我的当前目录下生成一个叫 dot 的可执行文件。如果不加这个参数,每次编译后生成的可执行文件都会放在根目录下,名字叫做 aout。每次编译成功后都会把上一次的 aout 文件覆盖。所以建议加上 -o 参数,这样可以更加条理。
最后一项便是你要编译的的源代码的名称了。我这里是 dotc。注意加上后缀 c。
输入完毕后按回车,如果编译没有任何问题,不会有任何提示。如果有问题,编译器会提示你问题是什么,在源代码的什么位置。如图所示:
如果编译成功,你会发现在你的当前目录下多出了一个可执行文件,图标如图所示:
在终端中输入 /可执行文件的名称 即可执行你的程序。例如,我输入
/dot
后,就可以执行程序了。如果提示你 Permission Denied,则是因为你没有赋予这个文件执行权限,需要在终端里输入
chmod u+x dot (这里是你自己的文件名)
来使其可在你的账户下执行。
如果运行时出现 Segmentation Fault,则说明你的代码里有 bug 导致程序崩溃。
希望对你有帮助
建议你看看编程的一些基础知识
- 经典hello word 程序
#include <stdioh>
int mian()
{
printf("hello world!\n");
return 0;
}
- 编译
-进入终端
-进入源文件所在的目录
$ gcc helloc -o hello
- 运行
$ /hello
要么写成 exec("gcc E:\\helloc -o E:\\helloexe");
要么用你的写法,但 gcc 要写上完整路径。
或者尝试 new String[] {"C:\\windows\\cmdexe", "/c", "gcc", "E:\\helloc", "-o", "E:\\helloexe"};
反正打散成数组参数后,第一个参数必须是完整路径,不能只写短名。
在命令行运行 java 时加上 java -Duserlanguage=en_US 就可以看到那些问号到底是什么错误消息了,有利于找出问题。
以上就是关于什么是GCCGCC有什么作用全部的内容,包括:什么是GCCGCC有什么作用、mac下的gcc如何使用。。、如何在linux系统中用gcc编译并且运行c程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)