Makefile

Makefile

  • 1.举一个Makefile的例子
  • 2.使用变量
  • 3.更省事的方式,让Make 自动推导
    • .PHONY:clean是什么意思?!
  • 4.cmake与Makefile的联系
    • 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

1.举一个Makefile的例子

hello_demo : hellospeak.o speak.o                                           
        gcc -o hello_demo hellospeak.o speak.o                               

hellospeak.o : hellospeak.c speak.h                                           
        gcc -c hellospeak.c                                                
speak.o : speak.c  speak.h                                                  
        gcc -c speak.c                                                    
clean :                                                                  
        rm hello_demo speak.o  hellospeak.o 

2.使用变量

objects = hellospeak.o speak.o                                               
hello_demo : $(objects)                                                   
        gcc -o hello_demo $(objects)                                        

hellospeak.o : hellospeak.c speak.h                                           
        gcc -c hellospeak.c                                                
speak.o : speak.c  speak.h                                                  
        gcc -c speak.c                                                    
clean :                                                                  
        -rm hello_demo  $(objects)       

3.更省事的方式,让Make 自动推导

潜规则:比如:helloworld.c 默认就是由helloworld.o生成

以下#注释掉的内容都可以由 $(objects):speak.h 替代

objects = hellospeak.o speak.o                                                   
hello_demo : $(objects)                                                        
        gcc -o hello_demo $(objects)                                            
                                                                           
$(objects):speak.h                                                             
#hellospeak.o : hellospeak.c speak.h                                              
#       gcc -c hellospeak.c                                                    
#speak.o : speak.c  speak.h                                                     
#       gcc -c speak.c                                                        
                                                                           
.PHONY : clean                                                              
clean :                                                                      
        -rm hello_demo  $(objects)

.PHONY:clean是什么意思?!

.PHONY : clean
clean :
-rm hello_demo $(objects)
与
clean :
-rm hello_demo $(objects)
的区别

在Makefile中,.PHONY关键字用于声明一个伪目标,表示该目标不是真正的文件名,而是一个伪目标,用于在执行Makefile时指定需要执行的操作。在这个例子中,.PHONY : clean声明了一个伪目标clean。

在第一个规则clean中,-rm hello_demo $(objects)指定了执行rm命令来删除名为hello_demo的文件以及变量$(objects)中指定的任何文件。-符号表示在删除这些文件时忽略错误,即如果文件不存在,则不会生成错误消息,Makefile将继续执行后面的规则。

在第二个规则clean中,只有一个指令-rm hello_demo $(objects),与第一个规则相同,但没有声明clean为伪目标。这意味着如果在Makefile中存在一个名为clean的文件,则该规则将不会被执行。因此,第一个规则是更好的选择,因为它能够保证在执行make clean时始终运行规则。

4.cmake与Makefile的联系

你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。

CMake就是针对上面问题所设计的工具:CMake真正实现了跨平台。

CMake允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等 。

安装cmake:  sudo apt-get install cmake
查看camke版本:cmake --version

在这里插入图片描述

在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

  1. 编写 CMake 配置文件 CMakeLists.txt 。
vi CMakeList.txt
#CMakeLists.txt 基本玩法

#CMake 最低版本要求
cmake_minimum_required(VERSION 2.8)

#项目信息
project(HelloSpeak)

#指定生成的目标
add_executable(CmakeHelloSpeak speak.c hellospeak.c)
  1. 在终端中进入项目根目录,创建一个名为 build 的文件夹,在 build 文件夹中生成 Makefile 文件。可以使用以下命令:
mkdir build
cd build
cmake ..

其中 .. 表示上级目录,即项目根目录。

就是利用CMakeList.txt帮我们生成Makefile

  1. 在 build 目录中运行 make 命令来编译项目。可以使用以下命令:

make

  1. 可以使用以下命令运行项目:

./CmakeHelloSpeak

其中 CmakeHelloSpeak是可执行文件的名称。如果生成的是库文件,可以将其链接到其他项目中使用。

需要注意的是,CMake 是一个跨平台的构建工具,它可以生成不同平台下的不同编译器和构建系统所需的 Makefile 文件。因此,以上流程可以在不同的操作系统和编译器上使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/23729.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回收站中怎么找回误删除的文件?这几种方法很实用

当我们在电脑上操作文件的时候,难免会有不小心删除文件的情况发生。这个时候,我们可以打开回收站来找回误删除的文件。但是,有时候我们也会误将回收站清空。那么,该怎样才能找回已经误删除的文件呢?在这里提供了回收站…

chatgpt赋能python:用Python下载MP3的方法

用Python下载MP3的方法 如果你想从互联网上下载MP3,那么你可以使用Python来实现这个任务。在本文中,我们将介绍如何用Python编写程序来下载MP3,同时还将分享一些有用的工具和资源。 Python中使用的库 要下载MP3,你需要使用Pyth…

一篇文章搞定《Android事件分发》

一篇文章搞定《Android事件分发》 什么是事件分发MotionEvent事件事件如何从屏幕到APPInputManagerServiceWindowManagerServiceWindow小结 事件如何从APP到达对应页面第一步:分类第二步:送去Activity后续的传递小结: 页面的事件分发整个流程…

移动云COCA架构,重新定义下一代云

当前,算力已经成为 全球科技竞争的焦点 为此,移动云重磅发布 「移动云COCA(Compute on chip Architecture)软硬一体片上计算架构」 以下简称移动云COCA架构 以此打造国家级自主可控的 高性能算力底座 带动国产化智算产业成熟…

【ISO14229_UDS刷写】-5-$38诊断服务RequestFileTransfer理论部分

总目录:(单击下方链接皆可跳转至专栏总目录) 《UDS/OBD诊断需求编辑工具》总目录https://blog.csdn.net/qfmzhu/article/details/123697014 目录 1 $0x38 RequestFileTransfer诊断服务描述 2 0x38服务请求消息 2.1 0x38服务请求消息定义…

写给初学者的YOLO目标检测 概述

文章目录 什么是目标检测What is YOLO?为什么YOLO在目标检测领域如此流行?1. 速度快2. 高检测精度3. 更好的泛化性4. 开源 YOLO架构YOLO目标检测是如何工作的?残差块(Residual blocks)边界框回归(Bounding box regression)交并比…

基于ESP32-CAM 和 OpenCV 设计的手势控制虚拟鼠标

概述 在本文中,我们将使用ESP32-CAM和OpenCV开发手势控制虚拟鼠标。ESP32 Camera Module和Python程序可用于无线控制鼠标跟踪和点击操作。 入门者必须具备 Python、图像处理、嵌入式系统以及物联网的丰富知识。首先,我们将了解如何控制鼠标跟踪和单击,以及运行 python 程序…

20年前,微软给金山那刀,现今一举将WPS推上领奖台,WPS,赢了

WPS,赢了 正如姚冬(金山办公副总裁)所说: 文本的命令行到图形界面的那次,改变整个人机交互的方式,我们公司历史上最大的一次危机也是那一次, 但我们依然挺过来了,我们相信这次技术浪…

一个神奇的工具,让URL地址都变成了“ooooooooo“

一个神奇的工具,让URL地址都变成了"ooooooooo" 一、核心代码二、URL编码/解码 最近发现一个有意思工具,就是将一个URL地址转换为都是 ooooooooo 的样子,通过转换后的地址访问可以转换回到原始地址,转换的逻辑有点像短链…

linuxOPS基础_linux安装配置

Linux系统下载 Linux系统版本选择:CentOS7.6 x64,【镜像一般都是CentOS*.iso文件】 问题:为什么不选择最新版的8 版本? 7.x 目前依然是主流 7.x 的各种系统操作模式是基础 官网:https://www.centos.org/ ,…

springboot+vue4S店车辆管理系统(java项目源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的4S店车辆管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…

linux小技巧-如何修改IP(四种方法)

目录 项目场景: 方法分析及步骤介绍 原因分析: 解决方案: 项目场景: 项目上经常遇到修改IP的情况,这里总结一些各个情况下修改IP的方法,尤其时有时候没有主机屏幕显示,借助于命令行的方式修…

行业领先生物制药企业在冷链物流运输中采用虹科LIBERO温度记录解决方案

中国首个获得世界卫生组织国际通用名的生物Ⅰ类新药是用于抗血管内皮生长因子的融合蛋白,该药物通过结合血管内皮生长因子VEGF,竞争性抑制VEGF与受体结合并阻止VEGF家族受体的激活,从而抑制内皮细胞增殖和血管新生,达到治疗湿性年…

即时通讯软件(企业IM)对企业的作用

随着网络时代的来临,即时通讯软件也开始逐渐在企业中流行起来,甚至很多公司都已经将即时通讯软件作为内部沟通的主要工具,那么这种情况下,即时通讯软件对企业究竟有什么作用呢? 首先,即时通讯软件对于企业内…

Solidity拓展:数据类型的转换

1.数据类型隐式转换 (自动) 同一类型之间的转换:由低长度转换为高长度int8-int16-int32int256,但int不能自动转换成uint,因为放不下负数所以直接不让转换,且 int8 不能转换成 uint256 (因为 uint256 不能涵盖某些值,例如, -1&…

Spark集群的运行基本流程是怎样的?

Spark集群的运行架构 Spark是基于内存计算的大数据并行计算框架,比MapReduce计算框架具有更高的实时性,同时具有高效容错性和可伸缩性,在学习Spark操作之前,首先介绍Spark运行架构,如图所示。 在上图中,Sp…

“数字”厨电成新宠?“传统”厨电如何凭实力年销破百亿?|厨房电器SMI社媒心智品牌榜

Social Power 核心解读 AI加持,数字厨电新物种持续走红 传统厨电发力社媒,“有范儿”实力吸睛 4月中下旬的“魔都”可谓热闹非凡,上海车展喧嚣未落,隔壁2023AWE(中国家电及消费电子博览会)的群雄逐鹿紧随…

PCIE知识点-022:PCIe 时钟结构

图1:参考时钟结构示意图[4] 1. Common Refclk Architecture Common Refclk Architecture,即同源参考时钟架构,PCIe收发设备共用一个时钟源,是目前是使用最为广泛的方案。 缺点: 对于适用同一 Common Clock 作为参考时…

新冠又临“涨潮”期,看我AI显身手

#疫情#北京时间5月24日,北京市卫生健康委发布2023年第20周疫情周报。报告显示,2023年第20周全市共报告法定传染病14种25544例,死亡1例。报告病例数居前5位的病种依次为:新型冠状病毒感染、其它感染性腹泻病、流行性感冒、肺结核和病毒性肝炎&…

chatgpt赋能python:Python请求头——让你的网络请求更有效率

Python请求头——让你的网络请求更有效率 网络请求是现代应用程序的核心。但是,如果你不了解Python请求头的概念和用途,那么你可能会面临一些棘手的问题。在本文中,我们将深入探讨Python请求头,了解其作用、语法和最佳实践。 什…