Ubuntu用gcc和Makefile编译C程序以及Windows编译C程序

Ubuntu用gcc和Makefile编译C程序以及Windows编译C程序

文章目录

(一)在Ubuntu系统下用C语言编写程序1.Ubuntu系统下用C语言编写输出hello world的程序2.用gcc命令行方式编译并运行程序1.编写C程序2.gcc编译过程3.gcc直接编译

(二)与windows平台编程对比(三)用Makefile方式编程主程序1.Makefile文件编写规则2.编写Makefile文件并编译

(四)总结

(一)在Ubuntu系统下用C语言编写程序

1.Ubuntu系统下用C语言编写输出hello world的程序

打开vim并创建hello.c文件

编写hello.c

#include

int main() {

// 输出Hello World

printf("Hello World!\n");

return 0;

}

编译并运行

2.用gcc命令行方式编译并运行程序

1.编写C程序

编写main1.c程序

#include

// 声明x2x函数

float x2x(int a, int b);

int main() {

// 定义并初始化两个整型变量

int val1 = 15;

int val2 = 8;

// 调用x2x函数进行运算

float result = x2x(val1, val2);

// 输出运算结果

printf("x2x(%d, %d) 的运算结果为: %.1f\n", val1, val2, result);

return 0;

}

编写sub1.c程序

float x2x(int a, int b) {

// 计算两个整数的乘积后除以2,返回浮点数结果

return (a * b) / 2.0f;

}

2.gcc编译过程

编译阶段编译命令作用说明预处理gcc -E main1.c -o main1.i处理所有以#开头的预处理指令(如#include、#define、#ifdef等)编译gcc -S main1.i -o main1.s将预处理后的代码(.i文件)转换为汇编语言代码汇编gcc -c main1.s -o main1.o将汇编语言代码(.s文件)转换为机器语言指令链接gcc main1.o sub1.o -o main1将多个目标文件(.o)和所需的库文件链接在一起

3.gcc直接编译

步骤一

命令:gcc main1.c sub1.c -o main1_app作用:使用 GCC 编译器将两个 C 语言源文件 main1.c 和 sub1.c 编译并链接成一个名为 main1_app 的可执行文件 步骤二

执行./main1_app命令,即执行编译生成的main1_app程序

(二)与windows平台编程对比

工具:Dev-C++

程序:与Ubuntu系统一致

两系统编程对比

Dev-C++上无法直接对多个文件进行编译 我创建了三个源代码文件,此时是在main1.c文件下点击编译让其进行编译,由于sub1.c和sub1.h都没有进行编译,所以报错提示没有定义x2x函数。

解决办法 不要单独创建源文件,新建文件时选择新建工程,如下图所示

然后再选择创建C++/C项目

创建成功后,就可以一次性编译多个文件(整个工程);运行结果如下图

(三)用Makefile方式编程主程序

1.Makefile文件编写规则

由目标、依赖和命令三部分组成

目标:可以是要生成的文件名(如可执行文件、.o目标文件),也可以是操作名称(如clean)。

依赖:生成该目标所需要的文件或其他目标。如果依赖文件比目标更新,make会执行命令重新生成目标。

命令:生成目标的具体操作(如编译命令),必须以Tab键开头(不能用空格替代)。

2.编写Makefile文件并编译

编写Makefile文件

main1_app: sub1.o main1.c

gcc -Wall -O2 main1.c sub1.o -o main1_app

sub1.o: sub1.c

gcc -Wall -O2 -c sub1.c -o sub1.o

clean:

rm -f *.o main1_app

.PHONY: clean

使用Makefile编译c程序

执行命令make,即可编译得到可执行文件main1_app

删除编译产生的中间文件

执行命令make clean,即可删除编译过程中产生的*.o文件

(四)总结

在本次 Ubuntu 系统下的 C 语言编程实践中,我分别采用了 gcc 直接编译和 Makefile 编译两种方式来生成可执行文件。通过使用 gcc 这种更基础的编译工具,我得以深入了解 C 语言源程序转化为可执行文件的完整流程,这与 Windows 环境下 IDE 提供的 “一键编译” 形成了鲜明对比。 尽管 IDE 的自动化编译功能带来了便捷,却在一定程度上掩盖了编译过程的细节。而手动操作编译步骤,让我清晰认识到了从预处理、编译、汇编到链接这一系列环节各自的作用和相互关系,从而更透彻地理解了 C 语言程序是如何从源代码逐步转化为计算机可执行指令的。这种对底层过程的把握,是使用自动化工具时难以获得的。

相关推荐