首页 > 系统相关 >Linux 基础入门操作-实验二 makefile使用介绍 和 实验三 hello 输出

Linux 基础入门操作-实验二 makefile使用介绍 和 实验三 hello 输出

时间:2024-09-16 14:55:02浏览次数:11  
标签:文件 Makefile makefile 编译 objects 实验 clean Linux hello

1 介绍

Makefile 是 linux 下的项目管理工具,想象一下当有很多源文件需要编译、链接时,你只需执行 make命令即可完成编译操作,这样是不是很方便呢。make 命令执行时,需要一个 Makefile 文件,用来告诉 make命令需要怎么样的去编译和链接程序,下面详细介绍 Makefile 的使用与书写规则

2 makefile 书写规则

Makefile 里面的规则由“目标:依赖命令”组成。例如,以一个最简单 Makefile 文件为例,有一个源程序 hello.c 文件,编写 Makefile 文件编译生成可执行文件 hello,Makefile 内容如下:

hello:hello.c
	gcc hello.c -o hello
clean:
	rm -f hello

当执行 make 命令后,make 会在当前目录下找名字叫“Makefile”或“makefile”的文件。如果找到,它会找文件中的第一个目标文件(hello),并把这个文件作为最终的目标文件。如果 hello 文件不存在,或是 hello所依赖的文件的文件修改时间要比 hello 这个文件新,那么,他就会执行后面所定义的命令来生成 hello 这个文件。

像 clean 这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要 make 执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

注意:命令前面是以一个 Tab 键缩进,不能使用空格代替,所以 gcc hello.c -o hello 和 rm -f hello 前面是一个 Tab 键,切记!

3 Makefile 变量使用

当有很多源文件,头文件需要包含的时候,依赖项和编译命令的书写变得很麻烦,尤其当需要修改的时候,写的到处都是,很容易出错,这时候我们可以使用变量来方便我们的书写。
举个例子,有源文件 test1.c、test2.c、test3.c 编译生成可执行程序 test,Makefile 内容如下:

objects = test1.c test2.c test3.c
test: $(objects)
	gcc -o test $(objects)
clean:
	rm -f test

如例子中所写的,我们创建了一个 objects 变量,它的值是我们的依赖文件,这样在下面用到依赖文件的时候,可以用$(objects)来替代,这样做的好处就是,当我们需要修改依赖文件的时候,只需要修改 objects的值即可,便于维护。

Makefile 有三个非常有用的变量。分别是 @ , @, @,^,$<,代表的意义分别是:

$@:目标文件;
$^:所有的依赖文件;
$<:第一个依赖文件。

objects = test1.c test2.c test3.c
test: $(objects)
gcc -o $@ $^
clean:
rm -f test

4 输出 “Hello World

4.1 使用vim 编辑

#include <stdio.h>
int main()
{
	printf("hello world \n");
	return 0;
}

按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按 Esc 键进入命令状态,再用命令“:wq”保存并退出。这样我们便在当前目录下建立了一个名为 hello.c 的文件。

4.2 运行和编译程序

 gcc hello.c -o hello
 ./hello

4.3 makefile 编译

CC = gcc
EXEC = hello
OBJS = hello.o
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) -W -Wall -o $@ $(OBJS)
.PHONY: clean
clean:
-rm -f $(EXEC) *.elf *.gdb *.o

CC,EXEC,OBJS,$@是 Makefile 文件中定义的变量,与 C/C++中的宏一样,代表了一个文本字符串,在 Makefile 中执行时会自动原模原样的展开在所使用的地方。与 C/C++不同的是,可以在 MAkefile 中改变它的值,在 Makefile 中,变量可以使用在”目标“、”依赖“、”命令“、或是 Makefile 的其它部分中。

  •  CC 指明编译器
  •  EXEC 表示编译后生成的执行文件名称
  •  OBJS 目标文件列表
  •  all: 编译主入口
  •  .PHONY: Makefile 关键字,其后面的目标为伪目标
  •  clean: 清除编译结果

宿主机 ubuntu 的命令行 root@imax:~ ,表示 r o o t 用户,主机名 i m a x ,主目录 , ,表示 root 用户,主机名 imax,主目录~, ,表示root用户,主机名imax,主目录 , 是普通用户,#是超级用户 root

标签:文件,Makefile,makefile,编译,objects,实验,clean,Linux,hello
From: https://blog.csdn.net/huanghongqi11/article/details/142302527

相关文章

  • 一个简单的交叉编译riscv的makefile脚本
    为了编写一个使用特定交叉编译工具链(在这个例子中是`riscv64-unknown-linux-gnu-`)来编译`hello.c`的Makefile脚本,你需要设置`CROSS_COMPILE`变量,并在编译命令中使用这个变量来指定交叉编译器的路径。下面是一个简单的Makefile示例:```makefile#定义交叉编译工具链的前缀CROSS_COM......
  • 【Linux】Linux项目自动化构建工具-make/Makefile
    make/Makefile1.背景2.概念3.实例代码1.背景一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——......
  • Telnet的连接实验
    Telnet的连接实验Windows7虚拟机的Telnet服务由于windows11已经将telnet服务器端移除,为了测试Telnet的连接,要安装Windows7的虚拟机安装VMWare(点击图片跳转)安装光盘在VMVare安装Window7选典型安装在主机Window11/10这边打开客户端服务对虚拟机打开Telnet服......
  • Linux下通过命名管道实现进程间通信
    引入上一篇文章介绍了Linux中通过pipe创建匿名管道,并实现父子进程间通信的功能;当时我就提到了Linux中的另一种管道通信方式——命名管道,下面就来详细介绍一下;命名管道什么是命名管道命名管道(NamedPipe),也叫FIFO(FirstInFirstOut),是一种用于进程间通信(IPC)的机制。与匿名管......
  • 5.linux磁盘管理
     目录一.基本分区1.磁盘简介2.管理磁盘a.查看磁盘信息b.创建分区-MBRc.创建文件系统-格式化d.挂载mounte.查看挂载信息3.扩展二.逻辑卷LVM1.创建LVM2.VG管理3.LV扩容三.交换分区管理Swap1.简介2.查看当前的交换分区3.增加交换分区4.扩展点一.基本......
  • Linux内存管理知识-一篇文章了解堆和栈区别(进阶篇)
    前面已经介绍过,栈是由编译器在需要时分配的,不需要时自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。堆是由malloc()函数分配的内存块,内存释放由程序员手动控制,在C语言为free函数完成。栈和堆的主要区别有以下几点:(1)管理方式不同栈编译器自动管理,无需程序员手......
  • Kali Linux 2024.3 发布下载 - 领先的渗透测试发行版
    KaliLinux2024.3发布(Multipletransitions)-领先的渗透测试发行版ThemostadvancedPenetrationTestingDistribution请访问原文链接:https://sysin.org/blog/kali-linux/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgKaliLinux2024.3已经可以下载,发行......
  • Linux查看服务器日志
    一、tail这个是我最常用的一种查看方式用法如下:tail-n10test.log查询日志尾部最后10行的日志;tail-n+10test.log查询10行之后的所有日志;tail-fn10test.log循环实时查看最后1000行记录(最常用的)一般还会配合着grep用,(实时抓包)例如:tai......
  • 实验(?)
    虽然没有被叫走,但是鉴于我是生物大神,所以我也跟着去了科教馆二楼还有个录播教室,进去一看,录的实验选题是“淀粉-淀粉酶体系能否进行‘不同ph对酶反应活性的影响’实验”一上来先问我们,觉得淀粉无酶和酸性条件下是不是会水解,鉴于之前上课讲过一个类似的可逆反应,所以就一致回......
  • linux下安装部署Maven
    目录版本对应关系安装maven配置maven验证版本对应关系不同版本下载地址:https://archive.apache.org/dist/maven/Maven与JDK版本的对应关系主要取决于Maven的版本和所需的Java版本。以下是具体的对应关系:Maven2.0.11及以下版本支持JDK1.3和JDK1.4。Maven2.0.11及以上版......