Linux嵌入式开发——C编程

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 program
    4 |         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 program
    4 |         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_H
  
  int calcu(int a, int b);
  #endif
// input.c
  #ifndef _INPUT_H
  #define _INPUT_H
  
  void 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.o
	gcc -o main main.o input.o calcu.o
	
main.o: main.c
	gcc -c main.c
	
input.o: input.c
	gcc -c input.c
	
calcu.o: calcu.c
	gcc -c calcu.c

# clear需要执行的命令
clean:
	rm *.o
	rm 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

猜你喜欢

转载自blog.csdn.net/weixin_66578482/article/details/128888624