当前位置: 首页 > article >正文

Linux 基础入门操作-实验二 makefile使用介绍 和 实验三 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


http://www.kler.cn/news/308116.html

相关文章:

  • 【计算机网络】HTTP相关问题与解答
  • 深度学习:入门简介
  • ESP01的AT指令连接到阿里云平台
  • 春日教育技术:SpringBoot在线视频教学
  • Vue3: setup语法糖
  • Sass实现文字两侧横线及Sass常用方案
  • 微服务下设计一个注解标识是否需要登录
  • Maven入门学习笔记
  • 数据结构——“二叉搜索树”
  • Python和R均方根误差平均绝对误差算法模型
  • 监听RabbitMQ,向Elasticsearch 创建索引
  • python selenium网页操作
  • C++笔记---二叉搜索树
  • 动手学深度学习(pytorch)学习记录31-批量规范化(batch normalization)[学习记录]
  • C++基础面试题 | C++中的构造函数可以是虚函数吗? C++中的析构函数一定要是虚函数吗?
  • SpringBoot 消息队列RabbitMQ消息的可靠性 配置连接重试 生产者重连
  • 医学数据分析实训 项目三 关联规则分析作业--在线购物车分析--痹症方剂用药规律分析
  • 科技赋能司法:易保全如何重塑法律文书签署与庭审流程
  • yjs07——numpy数组的使用
  • 【Linux】-基本指令(上)
  • 7-16 一元多项式求导(vector)
  • Linux - iptables防火墙
  • 安全、稳定、高速的跨国文件传输系统
  • Vue3 : ref 与 reactive
  • 【DataSophon】Yarn配置历史服务器JobHistory和Spark集成historyServer
  • 【C++】list常见用法
  • 数据库基础(MySQL)
  • 【C++】——string类的模拟实现
  • 【网络】DNS,域名解析系统
  • Vue Application exit (SharedArrayBuffer is not defined)