一、说明
gcc是一款编译软件,是Linux系统自由软件的代表作品,最初只是C语言的编译器,后来支持C++、Java等多种语言。gcc通过文件扩展名来区分源文件的语言类型。
二、编译C程序
1.c首先创建一个工作目录mycfile
2.进入该目录,创建一个C源文件test.c
3.Ubuntu系统下使用gedit test.c命令对源文件进行编辑,输入源代码,并保存。
4.使用gcc test.c命令对源文件进行编译,这时当前目录下生成了一个绿色的文件(默认名为a.out),绿色表示该文件是可执行文件,所以a.out就是我们编译之后的程序了。
5.使用 ./ 加程序名 就可以运行该程序,如下图,运行成功!
6.如果要指定生成程序的名称,可以在编译时加-o参数指定,格式:gcc 源文件名 -o 生成文件名
默认情况下,生成的程序是具有可执行权限的,如果没有,可以使用命令添加
sudo chmod +x 程序名
三、分步骤编译
C程序的编译过程有四个步骤:预处理(Preprocessing) 编译(Compilation) 汇编(Assembly) 链接(Linking),gcc如果不带参数的话,默认是一次性完成这四个步骤的,直接生成可执行程序文件。
可以使用控制参数来分步编译。
1. -E预处理
gcc -E test.c -o test.i #test.i在test.c的基础上把头文件的内容插入进去了
使用cat 文件名|wc -l 命令可以查看文件有多少行
可见,源代码只有6行,预处理后把头文件内容插入进去了,有863行
2. -S 编译为汇编代码
gcc -S test.i -o test.s #.s是汇编代码文件后缀,这时候汇编代码文件只有37行了,由此可知,汇编只是把需要用到的函数进行汇编,头文件里大多数的代码都没有用到。
3. -c 汇编为目标文件
gcc -c test.s -o test.o #.o是目标文件扩展名,目标文件与可执行文件类似,都是机器能够识别的二进制文件,但由于没有链接,结构会稍有不同。
4.链接并生成可执行文件
没有参数
gcc test.o -o test #Linux下的可执行文件一般没有后缀。在链接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时该程序所调用的库函数也从各自所在的档案库中连到合适的地方。
**如果有多个源文件,可以这样编译(省去第1、2步):
gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc -c testn.c -o testn.o
gcc test1.o test2.o testn.o -o test
就OK了,这个test文件就是可执行文件(程序)
其他参数:
-pedantic #帮助程序员发现一些不符合ANSI/ISO C标准的代码
-Wall #让gcc显示警告信息
-Werror #让gcc在编译中遇到错误时停止继续
-ldirname # -l加目录名 将该目录加入到程序头文件目录列表中
补充说明:
./ 加程序名 就可以运行程序,这个 ./并不代表”运行”的意思,而是”当前目录”,如果直接使用程序所在的绝对路径也能运行此程序:
如果把该程序所在的目录路径保存到环境变量中,就可以在任何目录下调用此程序了(直接输入程序名就行)。
首先打开 环境变量配置文件/etc/profile (如果没有w权限,要先提升一下权限,sudo chmod 666 /etc/profile)
再用命令:gedit /etc/profile
在文件末尾输入:export PATH=$PATH:/home/cof/mycfile //这个cof是你的用户名
保存,就OK了。退出当前目录,测试一下:
??怎么没反应,原因如下,test是系统已有的命令
把原来的程序换个名字就行了。
运行成功了,以后我们在mycfile目录下自己写的程序也能像系统提供的命令一样,随时随地调用了。
注:
- 所做的分析来自笔者一个朋友的见解,如有不正确还请见谅。