一、目的
编写一个主程序main1.c和一个子程序文件sub1.c,sub1.c里包含一个运算函数,main1.c引用sub1.c文件分别在Ubuntu系统用gcc编译运行、在Windows用编译工具运行和在Ubuntu系统用makelife方式编译运行。
二、编译运行
2.1、代码展示
Ubuntu里写代码的方式又很多,可以打开命令行用vim,也可以自己下载编程软件,本文Ubuntu的有关操作都在vscode里完成 sub1.h:
#ifndef _SUB1_H
#define _SUB1_H
#include<stdio.h>
float x2x(int a,int b);
#endif
sub1.c:
#include"sub1.h"
float x2x(int a,int b){
float ans;
ans=(float)b/a;
return ans;
}
main1.c:
#include"sub1.h"
int main(){
int x=2,y=9;
printf("%.2f\n",x2x(x,y));
return 0;
}
2.2 Ubuntu里用gcc编译运行
Step1:用 gcc -c sub1.c 生成sub1.o文件 Step2:用 gcc main1.c sub1.o -o main1 (该步骤是将main1.c文件编译为mian1.o文件,然后链接sub1.o文件生成main1可执行文件) 步骤三:执行 ./main1命令,执行刚刚生成的main1可执行文件。 如下图:
2.3 在Windows里用编译器里运行(vscode)
第一反应应该都是把代码复制过去运行,但第一时间可能不行,会出现函数未定义,需要改一下步骤 Step1:进入到拓展页面,找到code runner,鼠标右键点击拓展设置,如下图: Step2:找到executor map,点击在settings.json设置 Step3: 找到 “c”: “cd $dir && gcc $fileName -o $fileNameWithoutExt &&
d
i
r
dir
dirfileNameWithoutExt”, 将$fileName改为*.c,建议复制下来操作,将原来那一份注释掉就行了 这样就可以运行啦,结果如下:
2.4 在Ubuntu系统里用makefile方式运行
2.4.1 make简介
make是一个工程管理器,就是一个自动化编译管理器,这里的自动指它能狗根据文件时间戳自动发现更新过的文件二减少编译的工作量,同时它通过读入Makefile文件的内容来执行大量的编译工作。
2.4.2 makefile简介
makefile是make读入的唯一配置文件 由make工具创建的目标体(target),通常是目标文件或可执行文件 要创建的目标体所依赖的文件(dependency_file) 创建每个目标体时需要运行的命令(command) 注意:命令前必须是一个“TAB键”,否则编译错误为:*** missing separator. Stop. makefile格式:
target : dependency_files ##dependency_files是依赖的文件
command #注意是一个TAB
想了解更多可以到大佬的博客:makefile从入门到放弃——博主吐血整理的笔记
2.4.3 makefile文件里的内容
shell里的命令前面都是tab分隔,如果提到上述出现的错误可以多用几个编译器试试
main1:sub1.o main1.c
gcc main1.c sub1.o -o main1
sub1.o:sub1.c
gcc -c sub11.c -o sub1.o
clean:
rm *.o
2.4.4 运行
到这一步就很简单了,直接在命令行进到makefile文件所在文件夹,输入make就行,不过得先把先前生成的main1执行文件删掉,不然就会提醒make: ‘main1’ is up to date。 结果如下图:
三、总结
今天使用了gcc、windows里的编辑器和makefile分别对相同程序进行了编译运行。用gcc可以知道每一步的变化,可以帮助我们对程序编译的过程理解的更深,但操作其实比较繁琐,而在编译器里却是一步到位,很方便,但我们对其中发生了什么却不得而知,而makefile方式更像是让我们自己弄一个ide,让其中的过程全自动化,不过过程怎么样是我们自己编写,同时makefile文件格式要求很严格,如果出现格式错误是用不了的,tab分隔符之后才能被识别为shell命令,切记!!!
|