GCC是GUN项目中的编译器组件之一,也是GUN最具有代表性的作品。在GCC刚刚设计之初只是仅仅作为一个C语言的编译器,但是GCC发展到现在,已经不仅仅只支持C语言了。他现在还支持的有C++、java、Objective C、COBOL语言,以及支持函数式编程和逻辑编程的Mercury语言等等并且成为了Linux下最总要的编译语言之一。下面我们来了解一下GCC的输入文件、基本语法等等。
GCC简单介绍
Gcc是GNU推出的多平台编译器,原名为GNU C Compiler,原来只是做C语言编译器,后来发展支持处理C++,继而可处理Fortran、Java、Pascal等语言,Gcc支持在多种硬体平台上编译可执行程序,目前,Gcc是Unix类操作系统的标准编译器。而GCC也不再单是GNU C Compiler的意思,而是GNU Compiler Collection也即是GNU编译器家族的意思了。
GCC输入文件的约定
GCC对于输入文件有以下的约定规则
|
GCC是一组编译工具的总称,在GCC中的软件包中包含了众多的工具,主要有以下的分类:
C编译器cc,cc1,cc1 plus,gcc
C++编译器c++,cc1 plus,g++
源代码预处理程序cpp,cpp0
库文件libgcc.a, libgcc_eh.a,libgcc_s.so,libiberty.a,libstdc++.[a,so],libsupc++.a
GCC执行过程
在使用GCC编译程序的时候看起来是只通过编译就可以完成但是GCC的执行过程包括预编译(Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)四个阶段。
而在实际编译的时候GCC先会调用cpp命令进行预处理,接着调用CC1命令进行编译并生成汇编代码。汇编过程是针对汇编语言的步骤,调用as命令进行工作,生成扩展名为.o的目标文件,当所有的目标文件都生成之后,GCC就调用连接器ld来完成最后的关键性工作链接。
GCC的基本语法
在GCC中,最基本的语法格式是gcc [options] [filenames]
其中,options是编译选项参数,而filenames是编译文件名。要注意的是如果编译的是C++就要使用c++/g++ [options] [filenames],而其它语言编译需要安装协议规范。
[options]常用值如下(这里只是部分的):
-c | 只编译不连接为可执行文件,最后只生成.o为后缀的目标文件 |
-ooutput_filename | 设置编译输出文件名为output_filename,gcc预设的输出可执行文件名为a.out |
-O | 对程序进行优化编译、连接,提高目标程序的执行效率,影响编译速度 |
-O2 | 比-O更好的优化编译、连接,影响编译速度 |
-Idirname | 为编译设置程序头文件目录列表,或者叫搜索路径,编译器会自动到该目录下查找所需的头文件。 |
-Ldirname | 为编译设置库文件目录,或者叫库搜索路径,连接时,编译器会自动到该目录下查找。 |
-lname | 要求编译器连接时装载名字为“libname.a”的函数库,注意名称,示例-lbb则表示libbb.a库。 |
-shared | 编译动态库 |
出错检查以及警告提示
#p#分页标题#e#
GCC编译器中含有完整的出错检查以及警告提示功能,它提供了30多条的警示信息还有3个警告级别,使用这些有助于增强程序的稳定性和更加完善程序代码的设计。
代码优化选项
如何进行代码优化?编译器通过分析源代码找出其中没有代打最优的部分,对其进行重新的组合,这样就可以改善代码的执行能力。GCC通过提供编译选项-On 来控制优化代码的生成,使用代码优化选项可以大幅度提高代码在大型程序中的运行速度。
编译实例
编译C文件:#gcc test.c -o tst 编译test.c C文件,生成tst.o
编译C++文件:#g++ Test.cpp -o tst 编译Test C++文件,生成tst.o
添加外部库查找路径:#g++ -L/usr/local/MySQL/lib test.cpp -o tst
程序用到了long long类型:#g++ -pedantic -Wno-long-long test.cpp -o tst
引用外部头文件:#g++ -I/usr/include/mysql/ test.cpp -o tst
引用带外部库:#g++ -lmysqlclient test.cpp -o tst
在文中知识对GCC进行简单的了解,例如[options]常用值只是把其中的一部分放了上来帮助了解GCC而已,如果有需要的朋友可以在网上查找关于[options]常用值的全部描述。总的来说GCC编译器对于现在的编程还是很有用处的,所以大家可以去了解学习一下GCC充实自己的开发知识。