LINUX 下GCC编译C、C++入门

GNU

是“GNU is Not Unix”的递归缩写,又称革奴计划,是由RichardStallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。

GCC

是GNU编译器集合(GNUCompiler Collector)的缩写,GNU编译器集合包括C,C++,Object-c,Fortran,JAVA和Ada的前端以及这些语言对应的库(libstdc++,libgcj,…),早期的gcc是指GNU的C语言编译器(GNU C Compiler),随着C++等语言的加入,gcc的含义才变化成了GNU编译器集合,C作为gcc的原生语言,故编译时不需要额外选项。

 

C、C++在GCC下的编译

1.编译环境的安装

sudo apt-get install build-essential (如果需要编译Fortran ,那么需要安装gfortran或g77)

2.C程序编译

1)简单C程序

以上文件保存为 hello.c ,要用gcc编译文件,使用: 编译:gcc -g -Wall hello.c -o hello 该命令将文件hello.c中的代码编译为机器码并存储在可执行文件hello中,机器码的文件名是通过-o指定的,如果被省略,输出文件默认为a.out,且如果当前目录中与可执行文件重名的文件会被覆盖。 -Wall:开启编译器几乎所有常用的警告 -g:表示在生成的目标文件中带调试信息,调试信息可以在程序异常终止产生core后,帮助分析错误产生的源头,包括产生错误的文件名和行 等非常多有用的信息。 运行:./hello 这可将执行文件载入内存,并使CPU开始执行其包含的指令,路径./指当前目录。 补充:GCC中的消息总是具有下面的格式: 文件名:行 :消息,编译器对错误和警告区别对待,前者将阻止编译,后者表明可能存在问题但是并不阻止程序编译。

2)编译多个文件

将hello world程序分成3个文件:hello.c ,hello_fn.c,hello.h

主程序hello.c如下:

在hello.c中没有包含stdio.h,因为没有直接调用printf,而hello.h包含了hello()函数的声明,如下:

而函数的真正的定义在hello_fn.c中,如下:

若要gcc编译以上源文件,使用下面命令:

gcc -Wall hello.c hello_fn.c -o newhello

注意到hello.h并没有在命令行中,因为愿文件中的#include“hello.h”指示符使得编译器自动将其包含到合适位置

运行:./newhello

源程序各部分被编译为单一的可执行文件,它与先前的例子产生的结果相同。

3)简单的makefile文件

要了解更多的信息,参看GNU Make手册

Make从makefile(默认是当前目录下的名为makefile的文件)中读取项目的描述,makefile指定了一系列目标(如可执行文件)和依赖(如对象文件和源文件)的编译规则。其格式:

目标:依赖

命令

对每一个目标,make检查其对应的依赖文件修改时间来确定目标是否需要利用对应的命令重新建立,注意到,makefile中命令行必须以单个的TAB字符进行缩进,且命令那行必须缩进

GNU Make包含许多默认的规则(参考隐含规则)来简化makefile的构建,比如说,它们指定‘.o’文件可以通过编译’.c’文件得到,可执行文件可以将’.o’链接到一起获得。隐含规则通过被叫做make变量的东西所指定,比如CC(C语言编译器)和CFLAGS(C程序编译选项);在makefile文件中它们通过独占一行的变量=值的形式被设置。对C++其等价的变量是CXX和CXXFLAGS,而变量CPPFLAGS则是编译预处理选项。

上面的makefile文件如下:

解读:使用C语言编译器gcc和编译选项-Wall ,从对象文件hello.o和hello_fn.o生成目标可执行文件hello(文件hello.o和hello_fn.o是通过隐含规则分别由hello.c和hello_fn.c生成)。目标clean没有依赖文件,它只是简单的移除所有编译生成的文件。rm名字-f抑制文件不存在时产生的错误消息。

注意:如果包含main函数的cpp文件为A.cpp,makefile中最好把可执行文件名也写成A。

2)C++编译

LINUX 下GCC编译C、C++入门
1)方法一: 使用gcc直接编译:$gcc -Wall hello.cpp -o hello,会 错,因为没有可识别的库 需要$gcc -Wall hello.cpp -o hello -lstdc++ lstdc++用来通知连接器链接静态库libstdc++.a,为什么C不需要呢,因为C是gcc的原生语言 2)方法二: GCC为C++专门的编译器g++: g++ -Wall hello.cpp -o hello 没有问题,直接生产hello


文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux24975 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2015年10月1日
下一篇 2015年10月1日

相关推荐