在Windows下开发通常使用各种IDE,但在Linux下进行C编程编译代码的话需要用到GCC编译器。
GCC 编译器的编译流程是:预处理、编译、汇编和链接。预处理就是展开所有的头文件、替换程序中的宏、解析条件编译并添加到文件中。编译是将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译。汇编就是将汇编语言文件编译成二进制目标文件。链接就是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件。
新建一个文件用gcc编译:
新建一个c_practice文件夹,在此文件夹下用vim编辑器新建一个main.c文件
提示没有vim编辑器,安装一下,再使用vim main.c命令编辑代码:
发现vim编辑器没有行号,设置一下,打开/etc/vim/vimrc文件,在文件最下面一行加上:set nu(记得使用管理员权限sudo vim vimrc,不然有可能没有写的权限),以及tab键首行缩进有8空格,同样用set ts=4修改一下
写一个helloworld
编译main.c文件使用命令如下
gcc main.c
编译器提示错误
修改后再编译可以看到文件夹中多出了a.out文件,这是刚刚编译生成的可执行文件,这是编译器自动命名的,使用./a.out运行下看看
想要指定可执行文件的名字的话,使用-o参数,如
gcc main.c -o main
main.c代码如下
1 #include <stdio.h>
2 #include "input.h"
3 #include "calcu.h"
4
5 void main()
6 {
7 int a, b, num;
8
9 input_int(&a, &b);
10 num = calcu(a, b);
11 printf("%d + %d = %d\r\n", a, b, num);
12
input.c文件代码:
1 #include <stdio.h>
2 #include "input.h"
3
4 void input_int(int *a, int *b)
5 {
6 printf("input two num:");
7 scanf("%d %d", a, b);
8 printf("\r\n");
9 }
calcu.c文件
1 #include "stdio.h"
2
3 int calcu(int a, int b)
4 {
5 return (a + b);
6 }
input.h文件
1 #ifndef _INPUT_H
2 #define _INPUT_H
3
4 void input_int(int *a, int *b);
5
6 #endif
calcu.h文件
1 #ifndef _CALCU_H
2 #define _CALCU_H
3
4 int calcu(int a, int b);
5
6 #endif
使用命令,输出如下
gcc main.c calcu.c input.c -o main
如果文件有成百上千个,编译起来时间就很长,书写也费劲,,为此提出了一个解决大工程编译的工具:make。
利用make工具可以自动完成编译工作,这些工作包括:
如果修改了某几个源文件,则只重新编译这几个源文件
如果某个头文件被修改了,则重新编译所有包含该头文件的源文件
利用这种自动编译可以大大简化开发工作,避免不必要的重新编译。make工具通过一个称为Makefile的文件来完成并自动维护编译工作,描述哪些文件需要编译、哪些需要重新编译的文件就叫做 Makefile,Makefile 就跟脚本文件一样,Makefile 里面还可以执行系统命令。使用的时候只需要一个 make命令即可完成整个工程的自动编译。Makefile文件描述了整个工程的编译、连接规则。
在工程目录下创建名为“Makefile”的文件,文件名一定要叫做“Makefile”!!!区分大小写
1 main: main.o input.o calcu.o
2 gcc -o main main.o input.o calcu.o
3 main.o: main.c
4 gcc -c main.c
5 input.o: input.c
6 gcc -c input.c
7 calcu.o: calcu.c
8 gcc -c calcu.c
9
10 clean:
11 rm *.o
12 rm main
上述代码中所有行首需要空出来的地方一定要使用“TAB”键!不要使用空格键!这是Makefile 的语法要求,编写好得 Makefile 如图所示:
这里使用gcc -c …命令将相应的.c文件编译成.o文件,然后用gcc -o main …命令将每个.o文件链接起来生成main可执行文件
接下来直接在命令行中输入“make”即可,make 命令会在当前目录下查找是否存在“Makefile”这个文件,如果存在的话就会按照 Makefile 里面定义的编译方式进行编译
执行make之后可以看到生成了对应的.o文件和main可执行文件,说明编译成功