文章目录
- Linux嵌入式开发——C编程
- 一、编写C程序
- 1.1、设置vim编辑器
- 1.2、编写C程序
- 二、编译C程序
- 三、make工具和Makefile文件
- 3.1、编写C程序
- C文件
- H文件
- 3.2、不使用make工具
- 3.3、使用make工具和Makefile文件编译
Linux嵌入式开发——C编程
一、编写C程序
我们目前就是使用VIM编辑器编写程序,当然,也可以使用vscode,但是vscode我们在后面介绍。
1.1、设置vim编辑器
首先我们需要设置vim编辑器的一个TAB=4个字节,来使得与我们的编程习惯相类似。具体操作如下所示:
首先输入如下命令:
sudo vi /etc/vim/vimrc
然后在最后一行输入 set ts=4,即可。然后设置vim编译器显示行号,便于我们观察,只需要在刚刚的文件后面再加上set nu即可。最终结果如下所示:
1.2、编写C程序
我们main.c 文件输入如下内容:
#include<stdio.h>int main(void){printf("hello world!\r\n");return 0;
}
二、编译C程序
编译的话,我们是使用gcc编译器去编译C程序。具体操作如下所示:
- -c:只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。
- -o:<输出文件名>用来指定编译结束以后的输出文件名,如果不使用这个选项的话 GCC 默认编译出来的可执行文件名字为 a.out。
- -g:添加调试信息,如果要使用调试工具(如 GDB)的话就必须加入此选项,此选项指示编译的时候生成调试所需的符号信息。
- -O:对程序进行优化编译,如果使用此选项的话整个源代码在编译、链接的的时候都会进行优化,这样产生的可执行文件执行效率就高。
- -O2:比-O 更幅度更大的优化,生成的可执行效率更高,但是整个编译过程会很慢。
当我们直接输入gcc xxx的时候,会默认生成一个a.out的可执行文件,如下所示:
gcc main.c
每一个文件都叫a.out也不是办法,我们为了美观,就指定一个我们想要的名字,但是需要使用-o命令,我们看一下具体使用方法:
gcc main.c -o main
值得我们注意的就是他的报错,我们需要进行了解!
我们在第四行的时候,没有把我们的 “\r\n”,放到引号内,我们看一下会产生什么效果。
#include<stdio.h>int main(void){printf("hello world!"\r\n);return 0;
}
就是在疯狂提示我们第四行,而且具体位置都给出了,和dev-c++类似,我们加以注意就好。
main.c: In function ‘main’:
main.c:4:30: error: stray ‘\’ in program4 | printf("hello world!"\r\n);| ^
main.c:4:30: error: expected ‘)’ before ‘r’4 | printf("hello world!"\r\n);| ~ ^~| )
main.c:4:32: error: stray ‘\’ in program4 | printf("hello world!"\r\n);| ^
三、make工具和Makefile文件
我们在编程过程中,经常出现许多的.C文件和.H文件,如果还是像上面一样,一个一个地用gcc去编译,显得比较的繁琐。而且当其中一个文件进行修改以后,整个文件需要重新编译,当项目包含文件较多时,这个是很浪费时间的。综上所述,这时候就需要一个自动化的编译工具,而他们就是我们的make和Make file,接下来我们就来看一看吧!
make:一般说GNU Make,是一个命令工具,是一个解释 makefile 中指令的命令 工具,用于将源代码文件编译为可执行的二进制文件,make工具主要用于完成自动化编译。make工具编译的时候需要Makefile文件提供编译文件。
Makefile:make工具所使用的文件,Makefile指明了编译规则。
3.1、编写C程序
接下来,我们就来编写一个小型的文件,一共包含3个.c文件,2个.h文件。然后看一看make和Makefile是如何起作用的,具体代码如下所示:
C文件
// main.c #include <stdio.h>#include "input.h"#include "calcu.h"int main(void){int a, b, num;input_int(&a, &b);num = calcu(a, b);printf("%d + %d = %d\r\n",a, b, num);return 0;}
// input.c#include <stdio.h>#include "input.h"void input_int(int *a, int *b){printf("input two num:");scanf("%d %d", a, b);printf("\r\n");}
// calcu.c #include "calcu.h"int calcu(int a, int b){return (a + b);}
H文件
// calcu.h #ifndef _CALCU_H#define _CALCU_Hint calcu(int a, int b);#endif
// input.c#ifndef _INPUT_H#define _INPUT_Hvoid input_int(int *a, int *b);#endif
接下来,我们就来了解一下make工具的具体使用方法。
3.2、不使用make工具
我们不使用make工具,就只能将文件一起编译,使用的命令如下所示:
gcc main.c calcu.c input.c -o main
但是这样的话,每当我们对代码进行修改的时候,再次编译,便会将我们的源代码全部重新编译一下,前面说了,这样特别占用时间。有没有好办法能改进一下呢,答案是有,但是不多。那就是全部生成.o 文件,然后再连接到一起,每次有文件需要修改,便重新编译这一个文件,再次连接即可,但是这样,其实也很麻烦,所以就只能使用我们的make工具了。
gcc -c main.c
gcc -c input.c
gcc -c calcu.c
gcc main.o input.o calcu.o -o main# 当有文件需要修改
gcc -c input.c
gcc main.o input.o calcu.o -o main
3.3、使用make工具和Makefile文件编译
要想使用我们的make工具,我们首先需要在工程目录下创建名为“Makefile”的文件,然后在Makefile文件夹输入如下语句。(具体语法后面会介绍)
# 要得到main目标,需要main.o input.o calcu.o,需要执行
# gcc -o main main.o input.o calcu.o命令,后面的都是这样的。
main: main.o input.o calcu.ogcc -o main main.o input.o calcu.omain.o: main.cgcc -c main.cinput.o: input.cgcc -c input.ccalcu.o: calcu.cgcc -c calcu.c# clear需要执行的命令
clean:rm *.orm main
然后输入make指令即可。
make
运行结果如下所示:
gcc -c main.c
gcc -c input.c
gcc -c calcu.c
gcc -o main main.o input.o calcu.o
当我们修改其中一个文件时,看一下再次执行会产生什么样的后果。
gcc -c input.c
gcc -o main main.o input.o calcu.o
我们可以看到,只有修改后的文件被重新编译了,这样就比较自动化了。然后输入clear指令,就会发现我们需要清除的文件也清除了。
mclear
运行结果:
rm *.o
rm main
`
当我们修改其中一个文件时,看一下再次执行会产生什么样的后果。
gcc -c input.c
gcc -o main main.o input.o calcu.o
我们可以看到,只有修改后的文件被重新编译了,这样就比较自动化了。然后输入clear指令,就会发现我们需要清除的文件也清除了。
mclear
运行结果:
rm *.o
rm main