Ubuntu系统使用gcc和Makefile编译C程序
本文目的是为了通过在Ubuntu系统上编译多个c程序以此熟悉在Linux系统上编写c程序的操作。相关程序名称分别为main1.c、sub1.c、sub1.h;以下采用两种方式进行编译,第一种是直接使用gcc在命令行编译,第二种是使用Makefile文件编译。目录(一)直接使用gcc编译c程序1.准备工作2.gcc直接编译(二)与windows平台编程对比(三)使用Makefile编译c程序(一)直
·
本文目的是为了通过在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程序
(二)与windows平台编程对比
- 工具:Visual Studio Code
- 程序:与Ubuntu系统上一致
- 遇到的问题
- 无法多文件编译
因为我的文件夹下有一个main1.c文件,sub1.h和sub1.c文件。此时如果在main1.c文件下直接点击运行按钮会报错,因为sub1.c并没有编译,因此会出现main1.c引用的sub1.c中的函数没有定义的问题。
- 解决方法(默认已安装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语言的源程序是如何一步步变为可执行文件的。
更多推荐
已为社区贡献1条内容
所有评论(0)