前言
在windows中,编译文件一般是采用的“一键编译“的IDE,而实际上的编译产生可执行文件是经过了多步的。本文采取了在linux系统下gcc与makefile的方式来验证编译过程系统环境: VMware16、Ubantu 18.04
一、Ubantu中使用Vim编写保存.c文件
(以hello.c文件为例)
1、终端中使用touch命令创建 .c 文件
代码如下(示例):
touch hello.c \\在当前文件目录中创建hello.c文件
文件创建成功
2、利用vim编写 .c 文件
代码如下(示例):
vim main.c \\利用vim打开创建main.c文件
在vim中点击键盘小写字母 i 键进入输入模式,下面是hello.c代码,语法规则与windows中相同
#include<stdio.h>
int main()
{
printf("hello world! \n");
return 0;
}
输入完成后点击键盘 Esc 键,退出vim输入模式,然后同时按住 shift 与 : ,输入 wq ,保存文件并退出vim。
更加详细的vim操作参见
菜鸟教程:Linux vi/vim
- 输入 wc 保存hello.c时遇到的错误:‘readonly’ option is set (add ! to override)
- 解决方法:将 wc 换为 wc!
(参考:‘readonly’ option is set (add ! to override)-命令行保存
二、编译运行hello.c文件
1、直接使用GCC编译器编译运行文件
虽然我们称GCC是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
- linux终端中使用命令启动gcc编译器对hello.c文件进行编译
gcc -o hello hello.c \\第一个hello可以缺省,这个参数为编译文件保存的文件名
./hello \\ 输入 ./hello 执行上一步生成的hello文件
成功输出hello world! 运行成功
2、使用makefile方式编译文件
1)环境配置
sudo apt-install make \\安装makefile有关的软件
vim makefile \\ 创建makefile文件,并用vim打开
2)makefile代码编写规则
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
makefile的编写主要分为三部分:
目标体(target)、依赖文件(dependency_file)、命令(command)
target: dependency_files
< TAB >command
需要由make工具创建的目标体(target),通常是目标文件或可执行文件;
要创建的目标体所依赖的文件(dependency_file);
创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头;
3)makefile详细代码示例(以编译hello.c文件为例)
hello:hello.o
cc hello.o -o hello
hello.o:hello.c
cc -c hello.c
clean:
rm *.o hello
- 使用make命令编译文件
- 使用clean命令清除编译产生的中间文件
3、使用windows环境下编译文件进行结果验证
编译器 dev c++
- 编译结果
- 运行结果
三、一个更加复杂的例子
前文仅以hello.c单个文件为例,进行了gcc编译、makefile编译、dev c++编译,下面将以main1.c 与 sub1.c为例,讲解多个文件的编译
1、main1.c与sub1.c的内容
- 文件关系:main1.c为主程序,sub1.c为子程序
- 程序作用:
main1.c | 对两个输入整型参数做某个运算,将结果做浮点数返回 |
---|---|
sub1.c | 定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果 |
2、程序代码
主程序main
#include<stdio.h>
#include"sub.h"
int main()
{
int a = 1;
int b = 2;
float c = x2x(a,b);
printf("两数字之和为:%f\n",c);
return 0;
}
子程序sub
#include<stdio.h>
float x2x(int x,int y)
{
return x+y;
}
3、程序编译
1)ubantu环境下使用gcc直接编译
- 编译步骤与命令
gcc -c sub1.c //将sub1.c程序转换为目标文件sub1.o
gcc main1.c sub1.o -o main1 //编译main.c文件为目标文件main.o,然后链接sub1.o目标文件生成main1可执行文件
./main1 //执行编译生成的main1程序
- 编译与运行结果
2)ubantu环境下使用makefile编译
- 编译步骤与命令
main1:sub1.o main1.c
gcc main.c sub.o -o main
sub1.o:sub1.c
gcc -c sub1.c -o sub1.o
clean:
rm *.o
- 编译与运行结果
结果与上图一致,其原理与之前的简单例子相同,结构是一样的,内容有所区别
3)windows环境下使用Dev-C++编译
编译与运行结果与上述两种方法一致,具体步骤可查阅网上其他资料
更加复杂的makefile编译例子可参见
GNU make
四、 总结
本文介绍了VMware16中ubantu环境下,如何创建与编译C语言程序,分别介绍了直接使用gcc编译器与使用makefile编译器编译生成可执行文件。通过这次的实验,可以对编译器的工作原理与编译步骤得到更加深入的理解。
纯小白第一次写作,望大佬指教。
引用文献:
linux下make以及makefile(一)
【linux环境下】【C语言编译】【使用makefile】【详细版】
linux基础-makefile
linux下使用makefile进行文件的编译
(二)Makefile的编写规则、make的运行规则
Ubuntu系统使用gcc和Makefile编译C程序