题目:编写一个主程序文件 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.在不同的系统环境下运行main1.c主程序
1.1 在ubuntu20.04系统环境中编译运行main1.c
1.2 在windows系统中通过vs2022编译运行main1.c
2.使用makefile编译运行main1.c
3.总结
1.在不同的环境下运行main1.c主程序
1.1 在ubantu20.04系统环境中运行main1.c
首先在Ubuntu系统环境下,通过使用nano编辑器编写好子程序函数sub.c
主程序函数main1.c
头文件sub.h
接下来通过调用ubuntu系统中的gcc对程序进行编译并运行
首先我们需要学习一些有关gcc的语法知识
gcc编译大致需要四个编译阶段,分别是对程序进行预处理,编译,汇编,链接,接下来大致介绍一下这四个阶段的作用
1.预处理 (Preprocessing)
预处理阶段主要是处理源文件中的宏定义、头文件包含、条件编译等。例如,源文件中的 #include <stdio.h> 会在预处理阶段被替换为实际的头文件内容。预处理阶段生成的文件通常以 .i 结尾。
2.编译 (Compilation)
编译阶段主要是将预处理后的文件编译成汇编文件。GCC 首先将源代码文件(经过预处理)转换为一个或多个汇编语言文件,然后将这些汇编语言文件组合成一个单一的文件。编译阶段生成的文件通常以 .s 结尾。
3.汇编 (Assembly)
汇编阶段主要是将编译阶段生成的汇编文件转换为目标文件。目标文件是包含机器代码的二进制文件,但是它还不能直接运行,因为它可能有一些符号引用(例如函数调用)需要被解析。汇编阶段生成的文件通常以 .o 结尾。
4.链接 (Linking)
链接阶段主要是将汇编阶段生成的目标文件与所需的库链接起来,生成可执行文件。链接器解析符号引用,并且把所有的目标文件和库文件合并成一个单一的可执行文件。链接阶段生成的文件通常以可执行文件的形式存在,例如在 Unix 系统上是没有扩展名的,在 Windows 系统上是 .exe。
通常我们在使用gcc编译器对c语言程序进行编译时可以直接使用 gcc 源程序 -o 可执行文件
这条命令可以直接将我们的c语言源程序转换为可执行文件进行执行。
了解完了gcc编译器的具体运行过程之后,我们可以来对我们的main1.c程序进行编译并运行,由于main1.c中包含函数x2x是在sub.c中实现的,所以我们第一步需要通过gcc将sub.c进行预处理转化为目标文件
第二步,我们将main1.c文件编译并于sub.o文件进行链接生成可执行文件main1
第三步,执行可执行程序main1
1.2 在windows11系统中vs2022运行main1.c
首先编写程序main1.c
编写sub.h
编写sub.c
直接点击运行并查看结果
可以看到在window中VS2022编译器自动帮我们完成了对文件的预处理过程,而在使用gcc编译器时,我们无法同时编译两个c程序。
2.使用Makefile进行编译
Makefile的编写规则
target:prerequisites
command #command以一个tab键开始
#target为一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)
prerequisites是需要生成target所依赖的文件或是目标
#command也就是make需要执行的命令。(任意的Shell命令)
接下来我们在Ubuntu系统中通过nano编写makefile
保存文件在终端中使用make生产main1可执行文件并执行
3.总结
本次实验我在两种不同的系统和环境上使用不同的编译方式对main1.c等c程序进行了编译和运行,这次实验使我进一步了解了c语言程序转化为可执行文件的具体过程。
程序进行了编译和运行,这次实验使我进一步了解了c语言程序转化为可执行文件的具体过程。