文章目录
(一)在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 语言程序是如何从源代码逐步转化为计算机可执行指令的。这种对底层过程的把握,是使用自动化工具时难以获得的。