本文目的是为了通过在Ubuntu系统上编译多个C程序来熟悉在Linux系统上编写C程序的操作。相关程序名称分别为main1.c、sub1.c、sub1.h;以下采用两种方式进行编译,第一种是直接使用gcc在命令行编译,第二种是使用Makefile文件编译。

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

1.编写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;
}

2.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将目标文件转换为可执行文件

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程序

gcc直接编译过程

(二)与windows平台编程对比

  • 工具:Visual Studio Code
  • 程序:与Ubuntu系统上一致
  • 遇到的问题
    • 无法多文件编译
      因为我的文件夹下有一个main1.c文件,sub1.h和sub1.c文件。此时如果在main1.c文件下直接点击运行按钮会报错,因为sub1.c并没有编译,因此会出现main1.c引用的sub1.c中的函数没有定义的问题。
      VS code无法多个文件一起编译
    • 解决方法(默认已安装Code Runner)
      • 方法一:直接将sub1.h改为sub1.c,但是这种做法相当于把两个程序合并为一个,不提倡这样做,因为多次include可能会出问题。
      • 方法二:要让Code Runner支持编译该文件夹下全部.c文件,首先打开文件->首选项->Settings。然后在设置页面搜索Code Runner,找到Code Runner的Executor Map设置。
        在这里插入图片描述
      • 点击在settings.json中编辑,打开settings.json文件如图,找到executorMap设置项,在其中c程序对应的一行,修改其中的gcc $filename为gcc *.c(最好将原来的注释掉然后重新复制一份再修改)。
        在这里插入图片描述
      • 修改保存之后,再点击Code Runner运行按钮,可以直接编译运行了。
  • 运行结果
    在这里插入图片描述

(三)使用Makefile编译c程序

1.Makefile文件编写规则

target:prerequisites
	command			# command以一个tab键开始

# target为一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)
# prerequisites是需要生成target所依赖的文件或是目标
# command也就是make需要执行的命令。(任意的Shell命令)

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程序
    在源文件目录下执行命令make,即可编译得到可执行文件main1
    在这里插入图片描述
  • 删除编译产生的中间文件
    在源文件目录下执行命令make clean,即可删除编译过程中产生的*.o文件
    在这里插入图片描述

(四)总结

这次在Ubuntu系统上编写C语言并运行的实验,我使用了gcc直接编译和Makefile进行编译这两种生成可执行文件的方式;在整个过程中,通过gcc这种“原始”的编译工具,我深刻的理解到了如何从C语言源程序编译为可执行文件的过程,而不是像windows上IDE的“一键编译”。虽然这种IDE帮助我们简单方便的生成可执行文件,但却让我们忽略了整个编译过程中的各个步骤的作用,而这些编译过程会使我们更加了解整个C语言的源程序是如何一步步变为可执行文件的。

Logo

更多推荐