(一)直接使用gcc编译C程序

1.在终端中安装gcc

  • 输入下列命令
sudo apt update
  • 回车后输入密码后更新包列表

在这里插入图片描述

  • 输入下列命令安装软件包
 sudo apt install build-essential

在这里插入图片描述

  • 输入”Y“后回车继续
  • 输入以下命令验证gcc编译器是否安装成功
gcc --version

在这里插入图片描述

如图出现gcc 9.3.0即表示安装成功!

2.编写C程序

(1)编写一个hello.c文件

  • 在Documents中打开终端
  • 输入touch命令创建一个名为hello的文件夹
touch hello.c
  • 输入nano命令打开hello.c文件
nano hello.c
  • 写入代码后”ctrl s“保存,然后退出
#include<stdio.h>
int main(void)
{
  printf("HELLO WORLD\n");
  return 0;
}
  • 输入以下命令将hello.c文件进行预处理、汇编、编译并链接形成可执行文件hello,-o选项用来指定输出文件的文件名。
gcc hello.c -o hello
  • 输入以下命令得到输出结果(“.”代表当前目录)
./hello
  • 运行结果如下

在这里插入图片描述

(2)编写一个主程序文件main1.c和子程序文件sub1.c

  • 编写main1.c
#include"sub1.h"

int main()
{
	int x=2,y=9;            //定义x和y变量
	printf("%.2f\n",x2x(x,y));      //输出处理后的值,保留两位小数
	return 0;
}
  • 编写sub1.h
#ifndef __SUB1_H
#define __SUB1_H

#include<stdio.h>

float x2x(int a,int b);         //计算b除以a的结果

#endif
  • 编写sub1.c
#include "sub1.h"

/*******************/
/*     参数:a,b	   */
/*    返回值:ans    */
/*******************/
float x2x(int a,int b)
{
	float ans;
	ans=(float)b/a;
	return ans;
}
  • 输入以下命令将main1.c文件进行预处理、汇编、编译并链接形成可执行文件main1,然后得到输出结果

在这里插入图片描述

3.gcc编译过程(以编译hello.c为例)

编译阶段 编译命令 作用
预处理 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的文件转化为可执行文件,生成执行程序;

4.gcc直接编译

  • 步骤一

    • 命令:gcc -c sub1.c
    gcc -c sub1.c
    
    • 作用:将sub1.c程序转换为目标文件sub1.o
      在这里插入图片描述
  • 步骤二

    • 命令:gcc main1.c sub1.o -o main1
    gcc main.c sub1.o -o main
    
    • 作用:编译main1.c文件为目标文件main1.o,然后链接sub1.o目标文件生成main1可执行文件
  • 步骤三

    • 执行./main1命令,即可执行编译生成的main1程序
    ./main
    
    • 作用:执行编译生成的main程序。
      在这里插入图片描述

(二)与windows平台编程对比

  • 工具:Visual Studio 2019
  • 编写main1.c
#include"sub1.h"

int main()
{
	int x=2,y=9;            //定义x和y变量
	printf("%.2f\n",x2x(x,y));      //输出处理后的值,保留两位小数
	return 0;
}
  • 编写sub1.h
#ifndef __SUB1_H
#define __SUB1_H

#include<stdio.h>

float x2x(int a,int b);         //计算b除以a的结果

#endif
  • 编写sub1.c
#include "sub1.h"

/*******************/
/*     参数:a,b	   */
/*    返回值:ans    */
/*******************/
float x2x(int a,int b)
{
	float ans;
	ans=(float)b/a;
	return ans;
}
  • 再进行本地调试,开始编译执行代码,结果如下

在这里插入图片描述

(三)使用Makefile编译c程序

1.Makefile文件编写规则

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

2.编写Makefile文件并编译

  • 编写Makefile文件
main1:sub1.o main1.c
        gcc main1.c sub1.o -o main1

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

clean:
        rm *.o 
  • 使用Makefile编译c程序

在这里插入图片描述

(四)总结

  • 本次 Ubuntu 系统 C 语言编译实验,采用gcc 直接编译Makefile 编译两种方式生成可执行文件,核心收获在于跳出 Windows IDE “一键编译” 的黑箱,深入理解了 C 语言源程序到可执行文件的完整流程。
  • 通过 gcc 工具手动执行编译、汇编、链接等步骤,清晰掌握了各环节的功能与关联,明确了预处理如何处理头文件与宏定义、编译如何将源码转为汇编指令、汇编如何生成机器码、链接如何整合库文件与目标文件 —— 这些细节在 IDE 自动化操作中易被忽略,却为理解程序运行底层逻辑提供了关键支撑。
  • 而 Makefile 的使用,则进一步实践了多文件项目的编译管理,通过定义规则简化了重复编译操作,同时也体会到自动化工具在提升开发效率中的价值,形成了 “手动编译理解原理 + 自动化工具提升效率” 的完整认知,为后续复杂项目开发与问题排查奠定了基础。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐