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

news2024/9/23 4:19:42

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.coloradmin.cn/o/2156512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小球轻重的测量

设有12个小球。其中11个小球的重量相同&#xff0c;称为好球&#xff1b;有一个小球的重量与11个好球的重量不同&#xff08;或轻或重&#xff09;&#xff0c;称这个小球为坏球。试编写一个算法&#xff0c;用一个无砝码的天平称三次找出这个坏球&#xff0c;并确定其比好球轻…

GAMES101(15节,辐射,BRDF)

Irradiance辐射度量学 辐射度量学在渲染领域&#xff0c;可以帮助理解基于物理的光照模型 radiant energy辐射能量Q&#xff0c;累计总能量&#xff08;单位J joule焦耳&#xff09;&#xff0c;就像太阳能板&#xff0c;光照时间越长接收能量越多&#xff0c;收到的能量总和…

02_RabbitMQ消息丢失解决方案及死信队列

一、数据丢失 第一种&#xff1a;生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候&#xff0c;可能数据就在半路给搞丢了&#xff0c;因为网络问题&#xff0c;都有可能。 第二种&#xff1a;RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了。 第三种&#xff1a;消费端…

Attention is All You Need精读

原文开头&#xff0c;不是搬运 dog。All attention is all you need Abstract 摘要 这篇文章的内容源于基于编码器-解码器架构的RNN模型&#xff0c;在其他人的工作中&#xff0c;我们可以发现注意力机制对于提升编码器-解码器架构模型的性能很重要。这篇文章提出了一个比较简…

《代码整洁之道:程序员的职业素养》

作者&#xff1a;【美】Robert C. Martin 第1章 专业主义 专业主义就意味着担当责任&#xff0c;软件开发太复杂了&#xff0c;不可能没什么 bug。但很不幸&#xff0c;这并不能为你开脱。人体太复杂了&#xff0c;不可能尽知其全部&#xff0c;但医生仍要发誓不伤害病人。如…

隐藏excel单元格数据的两个方法

在Excel中&#xff0c;公式是用来计算数据和结果的非常重要的一部分。但是&#xff0c;有时候您可能希望隐藏公式&#xff0c;以保护其不被他人修改或查看。那么今天小编就来给大家分享隐藏excel单元格数据的方法。 一、使用“隐藏”功能 在Excel中&#xff0c;我们还可以使用…

ZYNQ学习--AXI总线协议

一、AXI 总线简介 AXI&#xff08;Advanced Extensible Interface&#xff09;高级拓展总线是AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;高级微控制总线架构中的一个高性能总线协议&#xff0c;由ARM公司开发。AXI总线协议被广泛应用于高带宽、低…

大语言模型超参数调优:开启 AI 潜能的钥匙

前言 在人工智能的广袤领域中&#xff0c;大语言模型&#xff08;LLM&#xff09;凭借其强大的实力&#xff0c;不断重塑着我们对机器理解语言的认知。然而&#xff0c;要使这些模型在特定应用场景中发挥最大效能&#xff0c;关键在于巧妙调整其超参数。本文将引领你深入探究 …

x-cmd pkg | bat: cat 命令现代化替代品,终端用户必备工具

目录 简介快速上手安装使用与第三方工具组合使用 功能特点竞品和相关作品进一步阅读 简介 bat 是由 github.com/sharkdp 用 Rust 开发的 cat 命令现代化替代品。它比 cat 命令扩展了更多的现代化功能&#xff0c;如语法高亮、自动分页、Git集成等&#xff0c;能为用户提供更为…

python如何跨文件调用自己定义的函数

当自己定义函数过多时&#xff0c;只有一个python文件时代码会很长&#xff0c;不易理清代码框架&#xff0c;比如下面这段代码&#xff0c;如何隐藏具体函数细节呢&#xff1f;也就是把def函数放到另外一个python文件里步骤如下&#xff1a; 一个python文件代码篇幅过长 imp…

结构体对齐、函数传参、库移植

结构体字节对齐 按固定位大小匹配地址&#xff0c;a:10b:1020位 <32位4字节 202040位>32位 所以ab20作为一个int型&#xff0c;int c:20 单独做4个字节&#xff08;int&#xff09; 101020 &#xff08;int&#xff09;4个字节 &#xff0c;20&#xff08;int&#x…

算法之逻辑斯蒂回归(Logistic regression)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 逻辑斯蒂回归&#xff08;Logistic Regression&#xff09;是统计学中一种广泛应用于二分类问题的算法。它的主要目标是预测二分类问题中的事件发生的概率。尽管名字里有“回归”&#xff0c;但逻…

wordpress迁移到别的服务器

wordpress论坛网站搭建 于2023/11/16写的该文章 一-配置环境 配置LNMP&#xff08;linuxnginxmysqlphpphpmyadmin&#xff09;环境或者LAMP&#xff08;apache&#xff09; 可以选择集成了这些软件的套件 下载链接&#xff1a;https://www.xp.cn/download.html 手动下载这…

https加密原理

以为http的数据都是以明文传送&#xff0c;会有很大的安全问题&#xff0c;所以出现的https协议。https就是在http协议的基础上增加了一个安全层&#xff0c;可以对数据进行加密和解密(例如SSL、TLS等)。 https加密解密的原理&#xff1a;证书非对称加密对称加密 在讲解原理前…

Python爬虫之urllib模块详解

Python爬虫入门 此专栏为Python爬虫入门到进阶学习。 话不多说&#xff0c;直接开始吧。 urllib模块 Python中自带的一个基于爬虫的模块&#xff0c;其实这个模块都几乎没什么人用了&#xff0c;我就随便写写了。 - 作用&#xff1a;可以使用代码模拟浏览器发起请求。&…

2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)

模块化概述 什么是模块&#xff1f;模块是一个封装了特定功能的代码块&#xff0c;可以独立开发、测试和维护。模块通过导出&#xff08;export&#xff09;和导入&#xff08;import&#xff09;与其他模块通信&#xff0c;保持内部细节的封装。 前端 JavaScript 模块化是指…

【Pytorch】一文快速教你高效使用torch.no_grad()

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 博主简介 博主致力于嵌入式、Python、人工智能、C/C领域和各种前沿技术的优质博客分享&#xff0c;用最优质的内容带来最舒适的…

2024年中国研究生数学建模竞赛A/C/D/E题全析全解

问题一&#xff1a; 针对问题一&#xff0c;可以采用以下低复杂度模型&#xff0c;来计算风机主轴及塔架的疲劳损伤累积程度。 建模思路&#xff1a; 累积疲劳损伤计算&#xff1a; 根据Palmgren-Miner线性累积损伤理论&#xff0c;元件的疲劳损伤可以累积。因此&#xff0c;…

基于SpringBoot+Vue的商城积分系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目源码、Python精…

手机在网状态查询接口如何用C#进行调用?

一、什么是手机在网状态查询接口&#xff1f; 手机在网状态查询接口是利用实时数据来对手机号码在运营商网络中的状态进行查询的工具&#xff0c;包括正常使用状态、停机状态、不在网状态、预销户状态等。 二、手机在网状态查询适用哪些场景&#xff1f; 例如&#xff1a;商…