目录

一、任务要求:

二、任务解决:

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

1.1.1、编写主程序main.c文件:

 1.1.2、编写头文件 sub1.h

 1.1.3、编写sub1.c文件

1.2、注:gcc的编译过程被划分为了四个阶段:预处理、编译、汇编和链接,

 1.3、gcc编译执行

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

3、在上述基础上,在ubuntu系统下用Makefile方式编程主程序 

 3.1、makefile编写规则如下:

3.2编写Makefile文件并编译

 三、总结


一、任务要求:

       编写一个子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算(本blog以加法为例子),将结果做浮点数返回;编写主程序main.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来。

    (1)在ubuntu系统用gcc 命令行方式编译主程序main.c 并运行。

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

    (3)在上述基础上,在ubuntu系统下用Makefile方式编程主程序。

二、任务解决:

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

       我目前在Ubuntu上常用的文本编写的命令是nano与vim,本次就选择使用vim来进行编写文本。首先,得在网上查资料安装gcc与vim,这里就不做详细介绍了,因为这不是本文的内容。插曲之后回归本题。

1.1.1、编写主程序main.c文件:

#include"sub1.h"
int main()
{

	int a = 5, b = 19;
	float sum = x2x(a, b);
	printf("%.2f\n", sum);
	return 0;

}

 1.1.2、编写头文件 sub1.h

#ifndef _SUB1_H
#define _SUB1_H

#include<stdio.h>

float x2x(int a, int b);

#endif

 1.1.3、编写sub1.c文件

#include"sub1.h"

float x2x(int a, int b)
{

	float sum;
	sum = a + b;
	return sum;

}

1.2、注:gcc的编译过程被划分为了四个阶段:预处理、编译、汇编和链接,

编译阶段  编译命令  作用
预处理  gcc -E hello.c -o hello.i 编译器将源代码中包含头文件编译进来
编译  gcc -S hello.i -o hello.s  检查代码规范性并翻译成汇编语言
汇编  gcc -c hello.s -o hello.o 将.s文件转换为目标文件
链接  gcc hello.o -o hello    将目标文件转换为可执行文件

简要理解就是:

预处理:生成 .i 的文件;

编译:将预处理文件转化为汇编语言并生成.s的文件;

汇编:将.s的文件转化为目标文件并生成.o的文件;

链接:将.o的文件转化为可执行文件,生成执行程序;

 1.3、gcc编译执行

第一步:

输入命令:

gcc -c sub1.c

作用:将sub1.c程序转换为目标文件sub1.o。

第二步:

输入命令:

gcc main.c sub1.o -o main

作用:编译main.c文件为目标文件main.o,然后链接sub1.o目标文件生成main可执行文件。

第三步:

输入命令:

./main

作用:执行编译生成的main程序。

总体实际演示效果如下:

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

编译工具:Visual Studio 2022;

程序:与Ubuntu系统上一致无区别

编译过程:

sub1.h:

sub1.cpp:

main.cpp:

 编译结果:

3、在上述基础上,在ubuntu系统下用Makefile方式编程主程序 

       注:首先,得在网上查资料安装makefile,这里就不做详细介绍了,因为这也不是本文的内容。插曲之后回归本题。

 3.1、makefile编写规则如下:

target:prerequisites
	command			# command以一个tab键开始

    1、# target为一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)
    2、# prerequisites是需要生成target所依赖的文件或是目标
    3、# command也就是make需要执行的命令。(任意的Shell命令)
    4、# rm *.o 用于删除中间产生的无用.o文件

3.2编写Makefile文件并编译

3.2.1、 此处利用vim工具进行对makefile文件的编写:

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

sub1.o:sub1.c
        gcc -c sub1.c -o sub1.o

clean:
        rm *.o 

3.2.3、使用Makefile编译c程序:

 三、总结

       本次在Ubuntu系统上进行对C语言的编写,我学会并且使用了两种方法:gcc和makefile来进行对编写的程序进行这两种不同的生成可执行文件的方式编译。在gcc的编译中,我第一次深刻的看见与理解到了C语言源程序编译如何变为可执行文件的过程,而不同于像windows上Visual Studio 2022的IDE的“一键编译”,如gcc的四个阶段:预处理、编译、汇编和链接。

       在makefile的编译中,我了解到Makefile的作用:就是在执行make命令的时候指定编译和链接的规则,包括源代码文件之间的链接关系、依赖关系等。它关系到整个项目工程的编译规则:哪些文件需要先编译,哪些要后编译,哪些需要重新编译等复杂的操作。同时展示makefile的优点如下:

  • 自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • 每次只会编译修改的和依赖于修改的那些文件,提高了编译效率。


参考文章:https://blog.csdn.net/qq_45237293/article/details/108741893

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐