一. 实验目的
(1)掌握Linux操作系统的安装方法、控制台常用命令
(2)掌握Linux下C程序的编写、编译与运行方法
(3)掌握gcc编译器的编译过程
(4)熟悉Makefile文件的编写格式
二. 实验内容
(1)实验室里的计算机安装了Windows操作系统,可以先安装VMWare软件(一般使用工作站版本)并启动它,来创建一个虚拟机,然后在其中安装Linux操作系统。登录Linux操作系统,回答下列问题:
- CPU的类型和型号。
- 所使用的Linux的版本。
- 从启动到当前时刻所经过的时间。
- 当前内存状态。
(2)编写简单的C程序,在屏幕上输出“Hello gcc!”。利用该程序练习gcc编译器的E、S、c、o选项,观察不同阶段生成的文件,即*.c、*.i、*.s、*.o文件。
(3)编写一个由头文件greeting.h、自定义函数文件greeting.c、主函数文件myapp.c构成的C程序,根据这三个文件的依赖关系编写Makefile文件。
三. 实验步骤
(1)安装Linux
查看CPU的类型和型号:cat /proc/cpuinfo | grep “model name”
查看所使用的Linux的版本:cat /etc/issue
查看从启动到当前时刻所经过的时间:uptime
查看当前内存状态:free -m
(2)编写C程序
C程序:
#include <stdio.h> int main(){ printf("Hello gcc!"); return 0; }
预处理:gcc -E hello.c -o hello.i
编译:gcc -S hello.c -o hello.s
汇编:gcc -c hello.c -o hello.o
链接:gcc hello.c -o hello
(3)编写Makefile文件
greeting.h源代码:
#ifndef _GREETING_H #define _GREETING_H void greeting(char *name); #endif
greeting.c源代码:
#include <stdio.h> #include "greeting.h" void greeting(char *name) { printf("Hello %s\n", name); }
myapp.c源代码:
#include <stdio.h> #include <stdlib.h> #include "greeting.h" #define N 10 int main(){ char name[N]; printf("your name, please:"); scanf("%s", name); greeting(name); exit(0); }
Makefile文件:
myapp: greeting.o myapp.o gcc myapp.o greeting.o -o myapp greeting.o: greeting.c greeting.h gcc -c greeting.c myapp.o: myapp.c greeting.h gcc -c myapp.c clean: rm -rf *.o
四. 实验结果
(1)安装Linux
(2)编写C程序
(3)编写Makefile文件
五. 实验总结
Makefile是一种自动化构建工具,用来描述源文件之间的依赖关系以及编译、链接等操作步骤,可以使编译、链接等操作自动化。在编译C程序时,使用Makefile可以大大简化编译过程。
编写Makefile的基本原则:
- 每个目标文件应该只由一个源文件生成。
- 每个源文件应该只编译一次,以提高编译效率。
- 应该在Makefile中指定编译器和编译选项。
下面简要介绍使用Makefile编译C程序的过程:
- 定义目标文件及依赖关系
在Makefile中,定义目标文件及其依赖文件是必须的。目标文件是要生成的二进制文件,依赖文件则是生成目标文件所需要的源文件及其头文件。
示例:
main: main.o function1.o function2.o
这段代码表示生成目标文件main,其依赖文件包括main.c、function1.c、function2.c和它们对应的头文件。
- 定义编译规则
在Makefile中,需要定义编译规则,即定义如何编译目标文件。
示例:
main.o: main.c function1.h function2.h gcc -c main.c
这段代码表示编译main.c生成main.o,-c表示只编译不链接。
- 定义链接规则
在Makefile中,需要定义链接规则,即定义如何将目标文件链接成最终的可执行文件。
示例:
main: main.o function1.o function2.o gcc -o main main.o function1.o function2.o
这段代码表示将main.o、function1.o、function2.o链接成可执行文件main。
- 完整的Makefile示例
main: main.o function1.o function2.o gcc -o main main.o function1.o function2.o main.o: main.c function1.h function2.h gcc -c main.c function1.o: function1.c function1.h gcc -c function1.c function2.o: function2.c function2.h gcc -c function2.c