如何在linux下运行代码

我们的代码通过vim等软件编写好后,它此时是.c或者是.cpp文件;我们如何将这个文件变成可执行文件呢?这个时候我们就需要使用gcc和g++指令了;

gcc和g++是什么

gcc和g++其实是两个linux下的软件gcc是C语言的处理软件,g++是c++的处理软件,我们通过输入,gcc 【选项】 (要编译的文件) 【选项】  (目标文件)这样的指令来对我们已经编写好的代码进行处理;

gcc和g++如何执行的:

在说这两个指令之前,我们先将我们代码的处理的四个阶段先分析一下;只有清楚我们的代码到底是怎么一步一步变成可执行程序的我们才能懂得这些指令的意义所在,也才能更贴近我们的计算机底层;

上一篇博客我们说了代码需要经过预编译,编译,汇编,链接四个阶段;

我们的gcc/g++也可以通过上图的指令一步一步将我们的代码进行一步一步的转换;这些指令的具体意义在下面的文章中我们一一解释;

预编译:

我们的gcc/g++是可以一步到位把我们的指令直接变成可执行程序的,但是为了让我们更清楚的知道,代码转换的过程,我们现在将这些过程一一的展现出来;我们首先进行预编译,使用

gcc -E code.c -o code.i指令,-E的意思是我们的gcc执行完预编译后就停止编译过程,-o的意思则是将处理完成的代码指定到-o后的文件中去;

预编译是对代码进行怎样的处理呢?它会将我们代码中的注释全部去除,将宏进行替换,将我们的头文件进行包含,还有对条件编译进行处理;

我们首先vim code.c将代码编写成如图所示:

我们再将我们的.c文件进行-E选项将其编译成.i文件

打开我们的.i文件我们可以看到我们代码的变化;

这就是预编译的过程;

编译:

编译我们使用gcc -S code.i -o code.s;这里使用-S我们文件编译完成后自动停止在此阶段;这个阶段我们的程序会检查我们的代码是否由语法错误,如果有就会报错显示在编译阶段出现错误,如果无误则会将我们的代码编译成我们的汇编代码;

使用此指令后打开这个文件我们就可以看到.s文件的汇编代码了;

汇编:

这个阶段,是将我们的汇编代码编译成我们的二进制目标代码也叫做可重定向的二进制目标文件;使用gcc -c code.s -o code.o;这个.o文件就是我们的目标文件了;

链接:

首先我们需要了解到链接是如何进行的,为什么我们要进行链接;在我们的代码中一定会使用像scanf,printf这样的函数,这些函数的实现我们并没有写但是我们可以使用它,这是由于C语言库的存在,C语言库中有实现了这些函数的代码,我们的代码中存的是printf这样函数的地址,在链接阶段我们通过这个地址去链接库中的函数实现,这就是链接,这种方式的链接叫做动态链接,因为是与代码外部的实现相链接的,如果我们把函数的实现下载打包到了我们的文件中,我们文件中就含有了函数的实现的话,这样的链接就叫做静态链接;我们通过这种链接方式将我们所有的文件进行合并链接,最后形成我们的可执行文件;一般我们的gcc链接是动态链接的;动态链接的好处就是可以减少我们磁盘上的内存占用,节约资源;而静态链接的优点是不依赖库是可以独立运行的;

拓展:函数库,可以分为动态库和静态库两种,静态库是下载打包好放在了我们的可执行程序中的,是在编译时就链接的,可是动态库,则是在文件外部的独立文件,我们在运行时会通过我们可执行文件中的地址找到我们的独立文件中的实现;我认为一般静态链接链接静态库,动态链接链接动态库;

链接的指令是gcc code.o -o code;这个code就是我们最后的可执行文件了;

这就是我们之前文件的运行结果了;

项目自动化构建工具:

当我们编写大型程序的时候必然会对各个文件进行编译,这样的工作非常繁琐,而且我们的调试肯定也会反复进行,如果我们每次编译程序都需要进行指令输入,一个一个编译我们的文件的话,那么这样的工作实在是太过于重复与愚笨了;所以我们可以编写一个makefile文件只要我们输入一个make指令,这个文件就会自动帮我们实现文件更新与编译还有删除的功能;接下来我们说一说如何编写makefile文件;我们首先touch Makefile文件,然后vim进入编写这个文件; 接下来我们看看下面的图片,这就是一个Makefile文件的最普通的编写;

上图中,我们的code是我们的目标文件,它依赖我们的code.c文件,利用我们下面的

gcc -o code code.c的依赖方法生成;我们的计算机先搜索磁盘中是否存在有目标文件,如果没有就利用依赖关系,通过依赖关系生成我们的目标文件,如果存在目标文件则会去检查目标文件和我们依赖文件的修改时间,如果目标文件新那么就不会运行下面的依赖方法的指令,如果后面的依赖文件新那么就会生成我们新的目标文件覆盖原有文件;

下面的.PHONY:这个是总是被执行的标志也叫伪目标,意思是不管我们的现有的目标文件是否比我们的依赖文件新,都总是执行下面的依赖方法;

如果没有这个标志,就如上面的code文件如果生成了,他是最后被改变的文件,它新于我们后面的依赖文件code.c那么我们就不会再执行下面的依赖方法了;

我们的Makefile文件是从上往下编写的,所以我们输入make指令运行的是最上面的这层依赖关系,如果我们想运行别的依赖方法,我们则需要输入make 目标文件文件名;这样就可以执行我们想要执行的目标了;如果是要执行伪目标的话那就make 依赖文件,直接执行我们的依赖方法;

如图,就可以看到我们使用make指令生成了code文件,并且make clean也能成功执行;通过这个方法,我们编写出makefile文件,我们就可以进行大量文件的编译和更新工作了;

第一个linux下的代码:

//															进度条代码
#include<iostream>
#include<unistd.h>

using namespace std;
int main()
{
	char percent[102]={0};
	char buffer[5] = "-\\|/";
	for (int i = 0; i <= 100; i++)
	{
		printf("[%-100s][%%%d] %c\r", percent, i,buffer[i%4]);
		fflush(stdout);
		percent[i] = '#';
		usleep(5);
	}
	printf("\n");

	return 0;
}

这个代码是使用\r的特性,\r是回车符,将我们的光标回到行最开头,可以覆盖掉原有代码,当被铺盖代码和覆盖代码的要覆盖部分相同时就会有类似进度条的效果出现;下面是window下的代码可以拿去使用看看效果:

//															进度条代码
#include<iostream>
#include<windows.h>

using namespace std;
int main()
{
	char percent[102]={0};
	char buffer[5] = "-\|//";
	for (int i = 0; i <= 100; i++)
	{
		printf("[%-100s][%%%d] %c\r", percent, i,buffer[i%4]);
		fflush(stdout);
		percent[i] = '#';
		Sleep(5);
	}
	printf("\n");

	return 0;
}

我也通过这个代码编出了我的第一个linux下的代码,以上就是如何在linux下运行代码的全部内容;

2023.9.22-2023.9.25

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值