推广 热搜: 二手  净利2626万  北京  二手车  SMM废铜现货交易日评  企业  全国  汽车  三星  公司 

linux系统里的gcc怎么使用

   日期:2024-05-17     来源:www.ylibra.com    作者:二手网    浏览:613    评论:0    
核心提示:[db:简介]

在linux中,gcc全名GNU Compiler Collection,中文意思为GNU编译器套件,是由GNU开发的编程语言编译器,是一个可以编译多种语言的编译器。gcc套件包含C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包含了这类语言的库。

1、什么是gcc

GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器,它是一个可以编译多种语言的编译器。GNU编译器套件包含C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包含了这类语言的库(如libstdc++,libgcj等。)

最开始gcc是作为C语言的编译器(GNU C Compiler),目前除去c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。

2、gcc的特征

gcc是一个可移植的编译器,支持多种硬件平台。比如ARM、X86等等。

gcc不止是个当地编译器,它还能跨平台交叉编译。所谓的当地编译器,是指编译出来的程序只可以在当地环境进行运行。而gcc编译出来的程序可以在其他平台进行运行。比如嵌入式程序可在x86上编译,然后在arm上运行。

gcc有多种语言前端,用于分析不一样的语言。

gcc是按模块化设计的,可以加入新语言和新CPU构造的支持。

gcc是自由软件。其他人都可以用或更改这个软件。

3、gcc编译程序的过程

gcc编译程序主要经过四个过程:

预处置(Pre-Processing)

编译 (Compiling)

汇编 (As百度竞价推广bling)

链接 (linking)

cript>cript>


预处置事实上是将头文件、宏进行展开。编译阶段,gcc调用不同语言的编译器,比如c语言调用编译器ccl。gcc事实上是个工具链,在编译程序的过程中调用不一样的工具。汇编阶段,gcc调用汇编器进行汇编。链接过程会将程序所需要的目的文件进行链接成可实行文件。汇编器生成的是可重定位的目的文件,学过操作系统,大家了解,在源程序中地址是从0开始的,这是一个相对地址,而程序真的在内存中运行时的地址一定不是从0开始的,而且在撰写源码的时候也不可以了解程序的绝对地址,所以重定位可以将源码的代码、变量等定位为内存具体地址。

下面以一张图来表示这个过程,注意过程中文件的后缀变化,编译选项和这类后缀有关。

这是GCC编译的四个步骤。

4、gcc常用选项

来看一下gcc常用选项

cript>cript>

目前大家有源文件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选项,编译器不会报出任何错误或警告,但程序的结果却不是预期的:

//bad.c#includestdio.hintmain(){printf(thenumberis%f,5);//程序输出了thenumberis0.000000,结果错误return0;}

用-Wall选项:

gcc-Wallbad.c-obad

gcc将输出警告信息:

warning:format%fexpectsargumentoftypedouble,butargument2hastypeint[-Wformat=]printf(thenumberis%f/n,5);

5、gcc编译多个文件

//hello.c#includestdio.h#includehello.hvoidprintHello(){printf(helloworld!/n);}

//main.c#includestdio.h#includehello.hintmain(){printHello();return0;}

//hello.h//仅包括函数声明#ifndef_HELLO_#define_HELLO_voidprintHello();#endif

编译这三个文件,可以一次编译:

gcchello.cmain.c-omain生成可实行文件main

也可以独立编译:

gcc-Wall-cmain.c-omain.ogcc-Wall-chello.c-ohello.ogcc-Wallmain.ohello.o-omain

独立编译有哪些好处是,当其中某个模块发送改变时,仅需编译该模块就好,不必重新编译所有文件,如此可以节省编译时间。

6、用外部库

在用C语言和其他语言进行程序设计的时候,大家需要头文件来提供对常数的概念和对系统及库函数调用的声明。库文件是一些预先编译好的函数集合,那些函数都是根据可重用原则撰写的。它们一般由一组互有关联的可重用原则撰写的,它们一般由一组互有关联的用来完成某项容易见到工作的函数构成。用库的优点在于:

模块化的开发

可重用性

可维护性

库又可以分为静态库与动态库:

静态库(.a):程序在编译链接的时候把库的代码链接到可实行文件中。程序运行的时候将不再需要静态库。静态库比较占用磁盘空间,而且程序不能共享静态库。运行时也是比较占内存的,由于每一个程序都包括了一份静态库。

动态库(.so或.sa):程序在运行的时候才去链接共享库的代码,多个程序共享用库的代码,如此就降低了程序的体积。

一般头文件或库文件的地方在:

/usr/include及其子目录底下的include文件夹

/usr/local/include及其子目录底下的include文件夹

/usr/lib

/usr/local/lib

/lib

7、生成静态库

为了生成.a文件,大家需要先生成.o文件。下面这行命令将大家的hello.o打包成静态库libhello.a:

arrcslibhello.ahello.o

ar是gun归档工具,rcs表示replace and create,假如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表示产生地方无关码(position independent code),地方无关码表示它的运行、加载与内存地方无关,可以在任何内存地址进行加载。

9、库的搜索路径

库的搜索路径遵循几个搜索原则:从左到右搜索-I -l指定的目录,假如在这类目录中找不到,那样gcc会从由环境 变量指定的目录进行查找。头文件的环境变量是C_INCLUDE_PATH,库的环境变量是LIBRARY_PATH.假如还是找不到,那样会从系统指定指定的目录进行搜索。

 
标签: linux系统 gcc
打赏
 
更多>同类二手资讯
0相关评论

热门推荐
推荐图文
推荐二手资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  免责声明  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报