系列文章目录
`
文章目录
前言
本文简单的介绍Ubuntu系统上编译多个C程序来熟悉在Linux系统上编写C程序的操作,Ubuntu的版本为20.04Desktop。涉及到的程序名称分别为main1.c、sub1.c、sub1.h;以下采用两种方式进行编译,第一种是直接使用gcc在命令行编译,第二种是使用Makefile文件编译。
一、使用gcc编译c程序
1.编写c程序
*main.c1
#include"sub1.h"
int main()
{
int a=2,b=10; //定义x和y变量
printf("%f\n",x2x(a,b)); //输出处理后的值,保留两位小数
return 0;
}
*sub1.h
#ifndef __SUB1_H
#define __SUB1_H
float x2x(int a,int b); //计算b除以a的一个函数
#endif
*sub1.c
#include "sub1.h"
/*******************/
/* 参数:a,b */
/*******************/
float x2x(int a,int b)
{
return (float)b/a;
}
2.gcc的编译过程(预处理、编译、汇编、链接)这里以hello.c做个基本的演示
(1)预处理
gcc -E hello.c -o hello.i
作用:编译器将源代码中包含头文件编译进来
(2)编译
gcc -S hello.i -o hello.s
作用:检查代码规范性并翻译成汇编语言
(3)汇编
gcc -c hello.s -o hello.o //-c汇编文件,不链接
作用;将.s文件转换为目标文件
(4)链接
gcc hello.o -o hello
作用:将目标文件转换为可执行文件
(5)演示图片
当然,如果我们仅仅只是需要目标文件的可执行文件也可以直接使用以下指令
gcc hello.c -o hello
gcc的编译过程并不是麻烦,相反其能够让我们理解计算机的底层逻辑,学习的价值极高,这里就不再赘述
3.gcc直接编译
步骤一
命令:gcc -c sub1.c
作用:将sub1.c程序转换为目标文件sub1.o
步骤二
命令:gcc main1.c sub1.o -o main1
作用:将main1.c文件编译为目标文件main1.o,同时链接sub1.o目标文件生成可执行文件main1
步骤三
命令:./main1
作用:执行编译生成的main1程序
二、在windows系统下编译运行main1.c
工具: Dev c++
程序:与Ubuntu系统上一致
得到相同的结果,但是在windows系统下无法多文件同时编译,我们需要创建一个项目工程,将main1.c,sub1.h,sub1.c放在同一个项目工程下才能够运行,这也是我们在构建项目常用到的一个思想——模块化编程,可以有效提高效能
我们不创建一个项目,将三个代码块“散装”是无法运行的
三、使用Makefile编译c程序
1.Makefile文件编写过程
目标 ... : 依赖 ...
命令1
命令2
. . .
target:prerequisites
command # command以一个tab键开始
# target为一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)
# prerequisites是需要生成target所依赖的文件或是目标
# command也就是make需要执行的命令。(任意的Shell命令)
https://blog.csdn.net/qq_45237293/article/details/108741893 可见详细说明
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.编写makefile文件并编译
(1)makefile文件的编写
main1:sub1.o main1.c
gcc main1.c sub1.o -o main1
main1.o:main1.c
gcc -c main1.c -o main1.o
sub1.o:sub1.c
gcc -c sub1.c -o sub1.o
(2)使用Makefile编译c程序
在源文件目录下执行命令make,即可编译得到可执行文件main1
删除编译产生的中间文件
在源文件目录下执行命令make clean,即可删除编译过程中产生的*.o文件
这里附上一张学长的实验图片(第一次编译makefile文件没有截图保存,后面输入make指令后显示main1已是最新
更过makefile的知识可以参考以下链接
https://blog.csdn.net/ZBraveHeart/article/details/123187908
四、总结`
这次在Ubuntu系统上编写C语言并运行的实验,我使用了gcc直接编译和Makefile进行编译这两种生成可执行文件的方式;同时通过这次的学习又再次感受到了从一个源代码程序进行汇编的步骤,对我了解计算机的底层逻辑又极大的帮助。