Linux嵌入式开发——C编程

news/2024/12/1 9:04:53/

文章目录

  • 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

http://www.ppmy.cn/news/22444.html

相关文章

Webug4.0靶场通关

14.Webug4.0靶场通关 显错注入 首先整体浏览网站 注入点&#xff1a; control/sqlinject/manifest_error.php?id1 判断注入类型 输入: and 11 正常, 再输入: and 12 还正常, 排除数字型 输入单引号: ’ 网页发生变化 输入’ – q注释掉单引号,页面回显正常 则为字符型 判…

Linux学习之VMware虚拟机安装

前言 今天是癸卯年正月十五元宵节&#xff0c;在此祝大家元宵快乐&#xff01; 这篇文章主要给大家介绍安装VMware虚拟机的步骤&#xff0c;话不多说&#xff0c;开始安装&#xff01; 安装准备 VWware-workstation rhel-8.2-x86_64-dvd.iso 64 位操作系统 VMware安装 可…

EAPOL四次握手流程

EAPOL四次握手流程协议功能数据帧格式四次握手流程数据帧日志解析组播代码协议 802.11i 功能 作用&#xff1a;派生和交换两组密钥 密钥包括ptk加解密单播数据&#xff0c;由用户设置的pmk扩展&#xff08;在setwork的时候通过pasapharse生成&#xff09; gtk加密解组播数据…

可变参模板指南

可变参模板 文章目录可变参模板可变参函数模板基本外观和介绍展开参数包(获取参数包的值)错误的演示正确的演示采取递归方式采取逗号表达式为什么需要逗号表达式其他方式应用1.求最大值&#xff08;可接受多个参数&#xff09;2. 用可变参数模板函数模仿printf的功能3. 使用tup…

Vue理解

1.是什么&#xff1f;Vue是一个用于创建用户界面的开源JavaScript框架&#xff0c;也是一个创建单页应用的web应用框架。Vue所关注的核心是MVC模式中的视图层&#xff0c;同时它也能方便地获取数据更新&#xff0c;并通过组件内部特定的方法实现视图与模型的交互。2.Vue核心特性…

Pyspark基础入门3

Pyspark 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase Hi…

C++高级教程——C++多线程

C高级教程——C多线程C 多线程创建线程终止线程实例连接和分离线程C 多线程 多线程是多任务处理的一种特殊形式&#xff0c;多任务处理允许让电脑同时运行两个或两个以上的程序。在一般情况下&#xff0c;有两种类型的多任务处理&#xff1a;基于进程和基于线程。 基于进程的…

Idea 运行多个微服务 Idea 一个服务开启多个端口运行 idea 开启多个端口服务

Idea 运行多个微服务 Idea 一个服务开启多个端口运行 idea 开启多个端口服务 一、情景描述 在使用idea 练习微服务项目时&#xff0c;如 要测试负载均衡功能&#xff0c;那么一个项目需要开启多个不同端口的服务&#xff0c;这个在idea中 如何实现呢&#xff1f; 二、设置步骤 …