编写第一个Makefile(HelloWorld)

2023-10-31

什么是Makefile

讲makefie之前,先将将什么是make;make是一个命令工具,是一个解释makefile中指令的命令工具。它可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile (or makefile) 这个文本文件,执行对应的操作。make 会自动的判别原始码是否经过变动了,而自动更新执行档。makefile其实就是一个文档,里面定义了一系列的规则指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,它记录了原始码如何编译的详细信息! makefile一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

Makefile编写规则

TARGET … : DEPENDENCIES …
  COMMAND
  …
目标(TARGET)程序产生的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”。
依赖(DEPENDENCIES)是用来产生目标的输入文件,一个目标通常依赖于多个文件。
命令(COMMAND)是make执行的动作,一个可以有多个命令,每个占一行。注意:每个命令行的起始字符必须为TAB字符!

编写一个Makefile

环境
我这里用的是镜像ubuntu-18.04.4
在这里插入图片描述
首先我们先找到一个目录(自己随意创建),然后在这个目录下创建两个文件夹
命令

mkdir hello
mkdir hello1

进入hello文件夹

cd hello

创建一个文件hello.c

vi hello.c

代码内容

#include <stdio.h>
extern void bar(void);//调用这个函数
int main()
{
	bar();
	return 0;
}

写完之后,进入到hello1文件夹编写一个bar.c的文件
代码内容

#include <stdio.h>
void bar(void)
{
	printf("hello world\n");
}

在这个文件里面创建并编写一个Makefile

vi Makefile

内容

HELLO1DIRM = /home/majie/linux-driver/hello1/bar.o
HELLODIR = /home/majie/linux-driver/hello

OBJ = hello
SRC = bar.c

$(OBJ):

	gcc -c $(SRC) //编译bar.c文件生成.o文件
	cp $(HELLO1DIRM) $(HELLODIR) #把生成的bar.o 拷贝到hello目录下

我这边的格式有问题后期就报错了
Makefile:6: *** recipe commences before first target. Stop.
问题的原因:这个代表这意味着有一行以空格、制表符或其他空格开头,而前面没有目标。
所以我们要严格按照它的格式
hello1目录下的Makefile

HELLO1DIRM = /home/majie/linux-driver/hello1/bar.o
HELLODIR = /home/majie/linux-driver/hello

OBJ = hello
SRC = bar.c

$(OBJ):
	gcc -c $(SRC) #编译bar.c文件生成.o文件
	cp $(HELLO1DIRM) $(HELLODIR) #把生成的bar.o 拷贝到hello目录下

写完这个之后,我们要去hello这个文件夹里面也写一个Makefile
和上面编写的方式一样
查看当前路径的指令pwd
在这里插入图片描述

hello目录下的Makefile

HELLO1DIR = /home/majie/linux-driver/hello1#我虚拟机下创建hello1的路径
HELLODIR = /home/majie/linux-driver/hello#同上,hello的路径

SRC = hello.c

tohello:
    $(MAKE) -C $(HELLO1DIR) M = $(HELLODIR) #MAKE 内置常量  执行hello文件夹下的Makefile时要先去执行hello1下的Makefile,执行完后再返回到hello这个目录下
    gcc -c $(SRC) #返回到这个文件夹后去编译hello.c这个文件
    gcc bar.o hello.o -o hello #把这两个bar.o hello.o文件生成可执行文件

由于我这边格式有问题后面make的时候会出下以下错误

 make: *** empty variable name.  Stop.

我们要改一下

$(MAKE) -C $(HELLO1DIR) M=$(HELLODIR) 

等号两边都不需要空格,格式很严格

编译工程

我们首先要进入到主目录hello目录下,然后输入指令make
在这里插入图片描述
编译成功!
在这里插入图片描述

然后我么你就可以运行可执行文件hello
指令

./hello

在这里插入图片描述

总结

第一次接触Makefile,写的也是很粗糙,可能中间还会有错误。表面上这个hello world要完成很简单,但是自己过程中还是遇到了很多问题,比如上面提到的,几乎都是格式问题。老样子:每次都没有一帆风顺过,总会给我报错,但是面向百度,面向CSDN就完事了!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写第一个Makefile(HelloWorld) 的相关文章

  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过
  • cdc_acm:无法设置 dtr/rts - 无法与 USB cdc 设备通信

    我试图使用 pic24fj128gb206 枚举 usb cdc 设备 设备似乎已正确枚举 但是当我将设备连接到 Linux PC 时 我从内核收到以下警告消息 cdc acm 1 8 1 6 7 1 0 failed to set dtr
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 研究缓冲区溢出时应该使用哪些版本的 GCC 或标志?

    最近 作为计算机工程专业的本科生 我一直在研究缓冲区溢出 出于兴趣 我开始研究缓冲区溢出 但在尝试在我的计算机上用 GCC 4 9 1 在 Debian Jessie 中 编译的我自己的 C 程序中实现它们时遇到了困难 我听说较新的编译器中
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 如何在文件中搜索多行模式?

    我需要找到包含特定字符串模式的所有文件 我想到的第一个解决方案是使用find管道与xargs grep find iname py xargs grep e YOUR PATTERN 但是 如果我需要查找跨越多行的模式 我就会陷入困境 因为
  • 跨 CPU 内核的 rdtsc 精度

    我从一个线程发送网络数据包 并在运行于不同 CPU 核心上的第二个线程上接收回复 我的流程测量每个数据包发送和接收之间的时间 类似于 ping 我使用 rdtsc 来获得高分辨率 低开销的计时 这是我的实现所需要的 所有测量结果看起来都很可

随机推荐

  • 如何在 Ubuntu 18.04 上安装 Atom 文本编辑器

    Atom是由GitHub开发的开源跨平台代码编辑器 它有一个内置的包管理器 嵌入Git控制 智能自动完成 语法突出显示和多个窗格 从本质上讲 Atom 是一个基于 Electron 构建的桌面应用程序 使用 HTML JavaScript
  • 如何在 Debian 9 上安装 R

    R 是一种快速发展的开源编程语言和环境 专门从事统计计算和图形表示 它由 R 统计计算基金会支持 主要供统计学家和数据挖掘人员用于开发统计软件和执行数据分析 本教程将引导您了解如何在 Debian 9 系统上安装 R 先决条件 在继续本教程
  • 如何在 Ubuntu 20.04 上安装和配置 Redis

    Redis 是一个开源内存键值数据存储 它可以用作数据库 缓存和消息代理 并支持各种数据结构 例如字符串 哈希 列表 集合等 Redis 通过 Redis Sentinel 提供高可用性 并通过 Redis Cluster 跨多个 Redi
  • Linux 中的 dmesg 命令

    Linux 内核是操作系统的核心 它控制对系统资源 如 CPU I O 设备 物理内存和文件系统 的访问 在引导过程中以及系统运行时 内核将各种消息写入内核环形缓冲区 这些消息包括有关系统操作的各种信息 内核环形缓冲区是物理内存的一部分 用
  • 如何在 CentOS 8 上设置 Nginx 服务器块

    服务器块是一种 Nginx 指令 它定义特定域的设置 允许您在一台服务器上运行多个网站 对于每个网站 您可以设置网站文档根目录 包含网站文件的目录 创建单独的安全策略 使用不同的 SSL 证书等等 本文介绍如何在 CentOS 8 上设置
  • 在 Debian 10 Linux 上使用 Let's Encrypt 保护 Nginx

    Let s Encrypt 是由互联网安全研究小组 ISRG 开发的免费 自动化 开放的证书颁发机构 提供免费的 SSL 证书 Let s Encrypt 颁发的证书受到所有主要浏览器的信任 并且自颁发之日起 90 天内有效 本教程展示了如
  • 如何在 Ubuntu 18.04 上设置 WireGuard VPN

    WireGuard 是一种采用最先进加密技术的现代 VPN 虚拟专用网络 技术 与其他类似解决方案 例如 IPsec 和 相比OpenVPN WireGuard 更快 更容易配置且性能更高 它是跨平台的 几乎可以在任何地方运行 包括 Lin
  • Linux 中的 pkill 命令

    本文涵盖了 Linux 的基础知识pkill命令 pkill是一个命令行实用程序 它根据给定的条件向正在运行的程序的进程发送信号 可以通过进程的完整名称或部分名称 运行进程的用户或其他属性来指定进程 The pkill命令是的一部分proc
  • Linux 触摸命令

    touch 命令允许我们更新现有文件和目录的时间戳以及创建新的空文件 在本指南中 我们将通过实际示例和最常见命令选项的详细说明向您展示如何使用 touch 命令 Linux 文件时间戳 在讨论如何使用 touch 命令之前 我们首先回顾一下
  • 如何在 Ubuntu 上安装 Deb 文件(包)

    Deb 是所有基于 Debian 的发行版使用的安装包格式 Ubuntu 存储库包含数千个 deb 软件包 可以从 Ubuntu 软件中心或使用命令行安装apt and apt get公用事业 许多应用程序不包含在 Ubuntu 或任何第
  • 如何在 Ubuntu 20.04 上安装 Gradle

    Gradle 是一种通用工具 用于构建 自动化和交付软件 它主要用于 Java C 和 Swift 项目 Gradle 结合了 Ant 和Maven 与使用 XML 进行脚本编写的前辈不同 Gradle 使用Groovy 一种动态的 面向对
  • 在 CentOS 7 上安装 Odoo 11

    Odoo 是世界上最受欢迎的一体化商业软件 它提供一系列业务应用程序 包括 CRM 网站 电子商务 计费 会计 制造 仓库 项目管理 库存等等 所有这些都无缝集成 Odoo11 需要 Python 3 5 CentOS 存储库中不提供该版本
  • Linux安装jenv,灵活管理jdk(不同目录,采用不同的jdk)

    前文 总所周知 随着java版本的不断升级 jdk版本越来越高 但是互联网开发软件很多还维持在jdk1 8的时代 但是很多开源软件只至此java 11以上的版本 这就会导致很多程序上的不兼容或者报错 本文主要解决 linux不同目录下 采用
  • Linux下修改java.library.path

    第一步 打印出当前的java library path有哪些目录 执行 vi Test java 切换编辑模式 i 插入如下代码 public class Test public static void main String args S
  • Anaconda创建新环境,CondaHTTPError: HTTP 000 CONNECTION FAILED for url <http://mirrors.tuna.tsinghua问题解决过程

    两步即可 第一步 配置anaconda为清华源 在Anaconda Prompt终端依次执行这些命令 conda config add channels http mirrors tuna tsinghua edu cn anaconda
  • MQTT协议

    http www blogjava net yongboy category 54835 html
  • 树莓派的连接与AP局域网路由器配置

    文章目录 前言 1 树莓派的连接 1 1 本地连接 1 2 远程连接 2 AP路由器配置 2 1 配置无线局域网 2 2 配置以太网实现局域网 前言 树莓派的连接方式分为两种 本地和远程 也可以通俗的说是有本地设备还是就一台笔记本的情况 本
  • 解决:无法解析的外部符号__iob_func

    解决 无法解析的外部符号 iob func 原文 http blog csdn net hebbely article details 53780562 在使用 VS2015 下使用 libjpeg turbo 静态库 编译时报错了 cpp
  • 【用户增长】用户增长方法论及增长思维

    用户增长方法论及增长思维 1 什么是用户增长 1 1 用户增长的概念及内涵 用户增长不是简单的用户数量的增长 用户增长是一个系统化 综合化的体系 用户增长包含三个阶段的增长 综上三点 我们可以简单的将用户增长定义为 通过痛点 产品 渠道 创
  • 编写第一个Makefile(HelloWorld)

    什么是Makefile 讲makefie之前 先将将什么是make make是一个命令工具 是一个解释makefile中指令的命令工具 它可以简化编译过程里面所下达的指令 当执行 make 时 make 会在当前的目录下搜寻 Makefil