前言

​ Linux系统具有开源、稳定、安全的特点,也因此成为了开发者的重要工作平台。其中,Ubuntu作为一个对用户友好的Linux发行版,特别适合作为入门学习和开发使用的操作系统。

​ 本文主要写关于嵌入式系统的程序设计基础。主要介绍在Ubuntu系统下进行简单C语言代码的编译流程和方法。

一、Ubuntu 系统安装

​ 在 Ubuntu系统一般采用 apt-get 命令进行某个软件的在线查找和安装,默认官方的软件源仓库位于国外,下载速度较慢。可修改系统参数,选择国内镜像软件源仓库,以提高软件安装速度(注意Ubuntu不同版本的对应不同名称,如Ubuntu22.04是jammy,Ubuntu20.04是focal,Ubuntu18.04是bionic,Ubuntu16.04是xenial)。

​ 安装Ubuntu系统以及选择国内镜像源的具体过程可参考【 https://www.bilibili.com/video/BV1DaxJzpEVm/?share_source=copy_web&vd_source=9076493cf65b60c919adb3322ed9255b】

二、在Ubuntu环境下编译“Hello World”

(1)安装C语言编译器gcc

想要在Ubuntu系统下编译程序,需要先安装C语言编译器——gcc。

sudo apt install gcc

在终端中输入如上指令即可。

(2)编写代码

​ 使用文本编辑器nano,创建一个文件夹(以“hello.c”为例)

nano hello.c

写入代码:

#include<stdio.h>

int main(void)
{
        printf("Hello World!\n");
        return 0;
}

保存并退出编辑器(如果使用nano,按Ctrl+X,然后按Y确认保存,最后按Enter键)。

输入以下命令编译并运行刚才创建的C语言源文件:

gcc hello.c -o hello
./hello

其中“-o hello”指定了编译后的可执行文件名为hello。

若是没有出现问题,将会在终端看到输出

Hello World!

实际操作图如图:
在这里插入图片描述

小结:本阶段完成在 Ubuntu 环境下 C 语言 Hello World 程序的编译与运行。首先通过apt包管理器安装 gcc 编译器,为 C 程序编译提供基础环境;然后使用 nano 文本编辑器创建hello.c源代码文件,编写基础 C 语言代码,实现控制台输出字符串功能;完成代码编写后,利用 gcc 命令将.c源文件编译生成可执行文件,再通过./hello命令执行程序,最终程序成功运行,终端输出Hello World!,验证整个流程可用。

三、编译多文件程序

任务要求:编写一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;主程序main1.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来。)

1)请在ubuntu系统用gcc 命令行方式编译主程序main1.c 并运行;

2)请在windows系统下用你熟悉的编译工具编译主程序main1.c 并运行。

(1)使用Ubuntu编译

使用文本编辑器nano,创建子程序文件“sub1.c“。

nano sub1.c

并在编译其中写入以下代码:

#include <stdio.h>

float x2x(int a, int b)
{
    float res = (a + b) * (a - b);
    return res;
}

保存并退出编辑器(如果使用nano,按Ctrl+X,然后按Y确认保存,最后按Enter键)。

同上,创建主程序文件件“main1.c”。

nano main1.c

并在编译其中写入以下代码:

#include<stdio.h>

float x2x(int a,int b);

int main(void)
{
        int num1 = 6;
        int num2 = 2;
        float ret;

        ret = x2x(num1,num2);
        printf("x2x函数计算结果 = %f\n",ret);
        return 0;
}

保存并退出编辑器(如果使用nano,按Ctrl+X,然后按Y确认保存,最后按Enter键)。

输入如下指令,将多个文件一起编译并运行:

gcc main1.c sub1.c -o main1
./main1

最终得到运行后输出的结果为

x2x函数计算结果 = 32.000000

实际操作图如图:
在这里插入图片描述

(2)使用Windows编译

使用Windows系统时,我以Visual Studio 2022为例,以下为操作步骤;

首先打开编译器Visual Studio 2022,创建新项目:
在这里插入图片描述

选择空项目并创建。然后点击上方 视图—>解决方案资源管理器—>右键 源文件—>添加—>新建项

—>C++文件(.cpp)。将两个文件夹分别命名为“main1.c”和“sub1.c”,并分别写入以下代码:

main1.c

#include <stdio.h>
float x2x(int a, int b);

int main(void)
{
    int num1 = 6;
    int num2 = 2;
    float ret;

    ret = x2x(num1, num2);
    printf("x2x函数计算结果 = %f\n", ret);
    return 0;
}

sub1.c

#include <stdio.h>
float x2x(int a, int b)
{
    float res = (a + b) * (a -b);
    return res;
}

代码加入之后,点击上方开始运行,得到结果如图:
在这里插入图片描述

小结:本阶段实验完成 C 语言多文件程序编写编译运行。程序拆分为main1.c主程序与sub1.c子程序:sub1.c中定义算术函数float x2x(int a,int b),实现(a+b)*(a-b)运算并返回浮点结果;main1.c负责定义整型变量、调用x2x函数并打印返回值。

四、使用Makefile编译C程序

(1)认识makefile编译c程序的指令及流程

编译程序:
在包含Makefile的目录下打开终端。

终端命令:

make:读取 Makefile,执行编译规则,生成可执行文件main

make clean:执行 clean 规则,删除生成的可执行文件

编译流程:

1、在源码目录创建Makefile文件,定义目标、依赖文件和对应的编译命令。

2、终端输入make,make 工具读取 Makefile,对比目标文件和依赖源码的修改时间。

3、如果源码更新,自动执行gcc命令完成编译链接;源码未改动,则跳过编译。

4、编译完成后使用./main运行程序。

5、实验结束执行make clean,清理编译产出。

原理简述:

make 工具会检查文件时间戳,只重新编译被修改过的文件,简化多文件项目的编译操作,不用重复输入冗长 gcc 命令。

(2)实际应用

任务要求:请编写一个主程序文件 main.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;主程序main.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来。请在ubuntu系统用gcc 命令行方式编译主程序main.c 并运行。(跟上面一样的任务,观察输出结果,主要是体会不同系统编译过程)

首先要先安装make工具,在终端中输入指令如下,即可安装全套c语言编译工具:

sudo apt update
sudo apt install build-essential

若是已经安装了gcc,只单独安装make,则输入一下指令即可:

sudo apt update
sudo apt install make

在“三”编写的代码的目录下,创建makefile文件,并且编译运行:

nano Makefile
make

“Makefile”文件内容如下:

main: main1.c sub1.c
        gcc main1.c sub1.c -o main

clean:
        rm -f main

此时将会输出

gcc main1.c sub1.c -o main

说明make工具已经读取到Makefile中的指令完成了编译链接,此时输入

./main

将得到和实验三一样的结果:

x2x函数计算结果 = 32.000000

实际操作图如图:
在这里插入图片描述

然后在终端中输入指令:

make clean

即可清理编译产物,删除可执行文件main。

实际操作图如图:
在这里插入图片描述

小结:在阶段任务 在前面的基础上,编写 Makefile 文件完成项目自动化编译。Makefile 定义编译目标main,指定依赖文件main1.csub1.c,并写明对应的 gcc 编译指令;同时添加clean目标用于清理生成的可执行程序。

五、总结

​ 本次实验以嵌入式程序设计基础为核心,基于Ubuntu 系统完成环境配置、C语言单文件编译、多文件联合编译、Makefile自动化编译等系列实操,全面掌握了Ubuntu系统下C语言程序开发、编译与运行的完整流程,熟悉了跨平台代码开发差异与项目自动化编译的基础原理。

​ 实验先是完成在 Ubuntu 环境下 C 语言 Hello World 程序的编译与运行,掌握了 nano 编辑器的基础操作(代码写入、保存退出),理解 gcc 编译命令参数-o的作用,熟悉 Linux 环境下源码→编译→运行完整流程,同时了解 Linux 系统中执行本地可执行文件需要加./的特点。最终程序成功运行,终端输出Hello World!,验证整个流程可用。

​ 然后完成 C 语言多文件程序编写与跨平台编译运行。在 Ubuntu 环境下,使用 nano 文本编辑器分别创建两个源码文件,通过gcc main1.c sub1.c -o main1命令一次性完成多文件的编译与链接,生成可执行文件后执行,成功输出计算结果。在 Windows 环境下,采用 Visual Studio 2022,新建空项目并添加main1.csub1.c两个源文件,VS 自动完成多文件编译链接,运行后得到和 Ubuntu 环境完全相同的输出。

​ 最后在上面任务的基础上,编写 Makefile 文件完成项目自动化编译。使用 Makefile 可以简化编译操作,避免重复输入复杂的 gcc 命令,适合由多个源文件组成的 C 语言项目,为后续大型程序开发打下基础。

建两个源码文件,通过gcc main1.c sub1.c -o main1命令一次性完成多文件的编译与链接,生成可执行文件后执行,成功输出计算结果。在 Windows 环境下,采用 Visual Studio 2022,新建空项目并添加main1.csub1.c两个源文件,VS 自动完成多文件编译链接,运行后得到和 Ubuntu 环境完全相同的输出。

​ 最后在上面任务的基础上,编写 Makefile 文件完成项目自动化编译。使用 Makefile 可以简化编译操作,避免重复输入复杂的 gcc 命令,适合由多个源文件组成的 C 语言项目,为后续大型程序开发打下基础。

​ 本次实验层层递进,全方位掌握Ubuntu环境下C语言开发的核心技能。不仅熟练掌握了Ubuntu系统基础指令、gcc编译、多文件编程、Makefile自动化编译等实操方法,还深刻理解了C程序编译链接原理与跨平台开发特性,为后续嵌入式系统开发、大型模块化项目编程奠定了坚实的实践与理论基础。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐