本文共 3710 字,大约阅读时间需要 12 分钟。
本节书摘来自异步社区《Linux C编程从入门到精通》一书中的第2章,第2.2节,作者:宋磊 , 程钢著,更多章节内容可以访问云栖社区“异步社区”公众号查看
gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,使用gcc可以编译C和C++源代码,编译出的目标代码质量非常好,编译速度也很快。本节主要讨论gcc的安装与使用方法。
2.2.1 gcc的安装
在Ubuntu12.04中,gcc是已安装好的,但是其还缺少常用的头文件和库文件,所以还需要安装build-essential这个包,可以在联网状态下使用如下命令来安装这个包。$ sudo apt-get install build-essential
/usr/lib。大部分的编译程序放在这个目录。在这里由编译时需要的可执行程序,还有一些特定版本的库文件与头文件等。
/usr/bin/gcc。指的是编译程序,即实际在命令行中执行的程序。这个目录可供各个版本的gcc使用,只要用不同的编译程序目录来安装就可以。/usr/include。这个目录及其子目录中包含程序所需要的头文件。缺少头文件,gcc在编译时会出现找不到头文件的错误。在安装完成之后,可以使用“gcc-v”命令来查看gcc的版本号。alloeat@Ubuntu:~$ gcc –v使用内建 specs。COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper目标:i686-linux-gnu配置为:../src/configure --v --with-pkgversion=’Ubuntu/Linaro 4.6.3-1Ubuntu5’ --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes--enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu -–host=i686-linux-gnu --target=i686-linux-gnu线程模型:posixgcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1Ubuntu5)
2.2.2 gcc的使用
gcc对C语言的处理需要经过如下4个步骤。预处理。这—步需要分析各种命令,如#define、#include、#if等。Gcc调用cpp程序来进行预处理工作。
编译。这一阶段根据输入文件产生汇编语言。由于通常是立即调用汇编程序,所以其输出一般不保存在文件中。Gcc调用ccl进行编译工作。汇编。这一步将汇编语言用作输入,产生具有.o扩展名的目标文件。Gcc调用as进行汇编工作。链接。这一阶段中,各目标文件被放在可执行文件的适当位置上,该程序引用的函数也放在可执行文件中(对使用共享库的程序稍有不同)。Gcc调用链接程序1d来完成最终的任务。和大多数shell命令一样,gcc的基本使用方式如下。gcc [选项] 文件名
gcc的命令选项可以组合使用,不过在使用时,每个命令选项都要有一个自己的连字符“-”。如果采用简写的方式,很可能使命令的含义完全不同。
在Linux下生成的可执行文件没有固定的扩展名。任何符合Linux要求的文件名,只要文件的访问属性中有可以执行的属性,该文件就是可以执行的。因此,在使用上面介绍的-o filename参数时,如果是生成链接后的可执行文件,filename变量可以取任意一个符合Linux要求的文件名。
gcc命令中的第2部分是一个输入给gcc命令的文件。gcc按照命令选项的要求对输入文件进行处理,形成结果输出文件。输入的文件不一定是C的源代码文件,还可能是预处理文件、目标文件等。如何确定输入文件的类型,gcc是通过输入文件的扩展名来确定的。表2.2是gcc与C相关的输入文件扩展名命名规范。
【例2.1】gcc编译器应用实例1。
【例2.1】是使用gcc来对一个C语言文件进行编译的应用实例,这个C语言文件被命名为ExamHello.c,使用cat命令可以查看该文件的内容:
alloeat@Ubuntu:~/chapter2Exam$ cat -n Examhello.c1 #include23 int main(void)4 {5 printf("This is a gcc test!\n");6 return 0;7 }
此时可以使用gcc命令对这个文件进行编译,然后运行。
alloeat@Ubuntu:~/chapter2Exam$ gcc Examhello.c -o Examhelloalloeat@Ubuntu:~/chapter2Exam$ ./ExamhelloThis is a gcc test!
在实际的开发过程中经常遇到应用代码比较复杂的情况,此时通常采用将主函数和其他函数放在不同文件中的方法。除了主程序之外,每个函数都由函数声明(函数头)和函数实现(函数体)两部分组成。函数的声明一般放在头文件(.h)中,而函数的定义文件放在实现文件中(.c)。gcc可以很容易地把多个源文件编译成目标代码并链接起来,如【例2.2】所示。
【例2.2】gcc编译器应用实例2。
这是使用另外一个C语言文件来存放输出函数的实例,在当前工作目录下建立一个C语言文件,其内容如下。
alloeat@Ubuntu:~/chapter2Exam$ cat -n Examhellosun.c 1 #include2 3 void sunprintf(void) 4 { 5 printf("this is a test from anthor .c!/n"); 6 }
然后建立一个.h头文件,其内容如下。
alloeat@Ubuntu:~/chapter2Exam$ cat -n Examhello.h 1 2 void sunprintf(void);
在Examhello.c文件声明对应的头文件。
alloeat@Ubuntu:~/chapter2Exam$ cat -n Examhello.c 1 #include2 #include "Examhello.h" 3 4 int main(void) 5 { 6 printf("This is a gcc test!\n"); 7 return 0; 8 } 9
可以使用如下的命令来对这两个C语言文件进行编译。
alloeat@Ubuntu:~/chapter2Exam$ gcc Examhello.c Examhellosun.c -o Examhello
转载地址:http://xkgxx.baihongyu.com/