在linux中,gcc全称“GNUCompilerCollection”,中文意思为“GNU编译器套件”,是由GNU开发的编程语言编译器,是一个能够编译多种语言的编译器。gcc套件包括C、C++、Objective-C、Fortran、Java、Ada和Go语言前端,也包括了这些语言的库。
本教程操作环境:linux7.3系统、DellG3电脑。
1、什么是gcc
GCC(GNUCompilerCollection,GNU编译器套件)是由GNU开发的编程语言编译器,它是一个能够编译多种语言的编译器。GNU编译器套件包括C、C++、Objective-C、Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)
最开始gcc是作为C语言的编译器(GNUCCompiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。
2、gcc的特点
3、gcc编译程序的过程
gcc编译程序主要经过四个过程:
预处理实际上是将头文件、宏进行展开。编译阶段,gcc调用不同语言的编译器,例如c语言调用编译器ccl。gcc实际上是个工具链,在编译程序的过程中调用不同的工具。汇编阶段,gcc调用汇编器进行汇编。链接过程会将程序所需要的目标文件进行链接成可执行文件。汇编器生成的是可重定位的目标文件,学过操作系统,我们知道,在源程序中地址是从0开始的,这是一个相对地址,而程序真正在内存中运行时的地址肯定不是从0开始的,而且在编写源代码的时候也不能知道程序的绝对地址,所以重定位能够将源代码的代码、变量等定位为内存具体地址。
下面以一张图来表示这个过程,注意过程中文件的后缀变化,编译选项和这些后缀有关。
4、gcc常用选项
现在我们有源文件hello.c,下面是一些gcc的使用示例:
gcc-Ehello.c-ohello.i对hello.c文件进行预处理,生成了hello.i文件
gcc-Shello.i-ohello.s对预处理文件进行编译,生成了汇编文件
gcc-chello.s-ohello.o对汇编文件进行编译,生成了目标文件
gcchello.o-ohello对目标文件进行链接,生成可执行文件
gcchello.c-ohello直接编译链接成可执行目标文件
gcc-chello.c或gcc-chello.c-ohello.o编译生成可重定位目标文件
使用gcc时可以加上-Wall选项。下面这个例子如果不加上-Wall选项,编译器不会报出任何错误或警告,但是程序的结果却不是预期的:
printf("thenumberis%f",5);//程序输出了thenumberis0.000000,结果错误
}
使用-Wall选项:
gcc-Wallbad.c-obad
gcc将输出警告信息:
warning:format‘%f’expectsargumentoftype‘double’,butargument2hastype‘int’[-Wformat=]
",5);
5、gcc编译多个文件
#endif
编译这三个文件,可以一次编译:

也可以独立编译:
gcc-Wall-chello.c-ohello.o
gcc-Wallmain.ohello.o-omain
独立编译的好处是,当其中某个模块发送改变时,只需要编译该模块就行,不必重新编译所有文件,这样可以节省编译时间。
6、使用外部库
在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明。库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的。它们通常由一组互相关联的可重用原则编写的,它们通常由一组互相关联的用来完成某项常见工作的函数构成。使用库的优点在于:
库又可以分为静态库与动态库:
一般头文件或库文件的位置在:
7、生成静态库
为了生成.a文件,我们需要先生成.o文件。下面这行命令将我们的hello.o打包成静态库libhello.a:
arrcslibhello.ahello.o
ar是gun归档工具,rcs表示replaceandcreate,如果libhello之前存在,将创建新的libhello.a并将其替换。
然后就可以这样来使用静态库libhello.a
gcc-Wallmain.clibhello.a-omain
还有另外一种使用方式:
gcc-Wall-L.main.c-omain-lhello【lhello是libhello的缩写】
其中-L.表示库文件的位置在当前目录下,由于libhello.a是我们自己生成的,并存放在当前录下下,所以需要加上-L.选项。默认库文件是在系统的目录下进行搜索。同样的,-I.选项用于头文件的搜索。
8、生成共享库
生成一个共享库,名称的规则是libxxx.so。将刚才hello.o生成libhello.so的命令为:
gcc-shared-fPIChello.o-olibhello.so
生成了共享库之后,可以这样来使用共享库:
gcc-Wallmain.o-omain-L.-lhello
该命令与使用静态库的命令相同,但是在共享库与静态库共存的情况下,优先使用共享库。
共享库有时候并不不在当前的目录下,为了让gcc能够找得到共享库,有下面几种方法:
拷贝.so文件到系统共享库路径下,一般指/usr/lib
在~/.bash_profile文件中,配置LD_LIBRARY_PATH变量
配置/etc/ld.so.conf,配置完成后调用ldconfig更新ld.so.cache
其中,shared选项表示生成共享库格式。fPIC表示产生位置无关码(positionindependentcode),位置无关码表示它的运行、加载与内存位置无关,可以在任何内存地址进行加载。
9、库的搜索路径
库的搜索路径遵循几个搜索原则:从左到右搜索-I-l指定的目录,如果在这些目录中找不到,那么gcc会从由环境变量指定的目录进行查找。头文件的环境变量是C_INCLUDE_PATH,库的环境变量是LIBRARY_PATH.如果还是找不到,那么会从系统指定指定的目录进行搜索。
相关推荐:《Linux视频教程》
以上就是linux里gcc是什么的详细内容,更多请关注主机测评网其它相关文章!
本文来源:国外服务器--linux里gcc是什么(linux中gcc是什么意思)
本文地址:https://www.idcbaba.com/guowai/5629.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1919100645@qq.com 举报,一经查实,本站将立刻删除。



