编译工具 Ninja 介绍

2023-11-04

什么是Ninja

Ninja是使用C++写的开源项目。

http://martine.github.io/ninja/

在Unix/Linux下通常使用Makefile来控制代码的编译,但是Makefile对于比较大的项目有时候会比较慢,看看上面那副漫画,代码在编译都变成了程序员放松的借口了。所以这个Google的程序员在开发Chrome的时候因为忍受不了Makefile的速度,自己重新开发出来一套新的控制编译的工具叫作Ninja,Ninja相对于Makefile这套工具更注重于编译速度。除了Chrome现在还有一些其他的比较大的项目也在开始使用Ninja,比如LLVM。我试用了一下感觉还是不错,比如编译Cmake时间大概是原来的1/4。Ninja试用C++实现,其支持的语法非常简单,作者在这里说明了为了控制复杂度。

代码如何编译

其实对于C/C++和很多其他程序的编译都是一个道理,就是把一些源代码文件编译成目标文件,或者有的目标文件再编译到一个库里,然后再链接起来。所以Ninja的配置文件分为两个部分,rule和文件依赖关系。看个简单的例子:

cc=gcc cflags= -g -c

rule cc command = $cc $cflags $in -o $out rule link command = $cc $in -o $out rule cleanup command = rm -rf *.exe *.o

build func.o           : cc func.c
build main.o           : cc main.c

build app.exe            : link main.o func.o

build all:  phony || app.exe
build clean: cleanup

非常易懂,编译的可执行未见叫做app.exe, 其中有三条rule: cc, link, cleanup。看看这个官方的试用手册,还有一些附加参数可以加在rule的下面,比如description用来在编译的时候显示出来。Ninja还有个比较好玩的功能就是Ninja -t graph all命令,这可以用来生成编译时候的依赖关系,可以用dot来生成图片等。Ninja的实现也可以大概推测到,根据用户给的依赖关系图,并行 地编译各个文件。

配置文件CMakeLists.txt

使用Ninja的一个问题就是需要生成这个build.ninja文件,对于大型项目来说这样一条一条地写配置文件是不可能的。幸好我们可以使用Cmake来生成这个配置文件,Cmake对应的是automake这样的东西。在Cmake的最新版本中已经支持参数Camke -G Ninja,Cmake会根据用户给定的CMakeLists.txt来生成build.ninja文件。而CmakeLists文件相对来说要简单一些,只要写清楚编译的可执行文件的名字,和其依赖的包含main函数的源文件。把我的迷宫小项目来举个例子,在项目文件夹下写配置文件CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) project (Maze) add_library(maze A_star.cpp Algorithm.cpp DFS_L.cpp DFS_R.cpp DisjSets.cpp Maze.cpp) add_executable(Maze.exe main.cpp) target_link_libraries(Maze.exe maze)

add_library写明了生成一个叫做maze.a的库文件,然后和main.cpp编译出来的main.o生成可执行文件,写好CmakeList.txt后运行Cmake -G Ninja, 然后运行ninja all就能编译这个工程。具体的Cmake语法参考这里,对于不少项目来说Cmake已经足够使用,只是我觉得Cmake还是稍微复杂了一点。

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

编译工具 Ninja 介绍 的相关文章

随机推荐

  • 爬虫毕设(三):爬取动态网页

    动态网页分析 按照上一篇的分析 直接使用XPath找到该标签 然后通过parse提取出数据 在写入到item中就完事了 但是 当信心满满的写完代码后却发现 控制台输入了一个简简单单的 小问号你是否有很多朋友 一顿操作猛如虎 一看输出数据无
  • 在Arduino中使用DS18B20温度传感器(基于OneWire和DallasTemperature库)

    文章目录 目的 快速使用 相关库引入 使用步骤 使用演示 演示一 演示二 演示三 相关库说明 OneWire库 DallasTemperature库 总结 目的 DS18B20是常用的温度传感器 功能够用 使用简单 本文将用Arduino第
  • 一周Hard (2021.12.20-2021.12.26)

    由于除了刷题外还有些个人的事情 所以大概本周的安排是这样的 本周前两天先研究下关于在周赛272中遇到的问题 打算思考明白并给出一个详细的证明 对于周赛272让我重新拎起LIS 打算对相应的题目进行学习 LC 673 另外大概是要重新学习DP
  • php 基于ICMP协议实现一个ping命令

    php 基于ICMP协议实现一个ping命令 网络协议是什么 ICMP 协议 什么是ICMP ICMP 的主要功能 ICMP 在 IPv4 和 IPv6 的封装 Wireshark抓包 ICMP 请求包分析 PHP构建 ICMP 数据包 p
  • FileInputStream 和 FileOutputStream

    1 什么是流 流是一连串流动的字符 是一组有序的数据序列 是以先进先出方式发送信息的通道 将数据从一个地方带到另一个地方 在 java 中所有数据都是使用流读写的 同时可以通过流进行文件的读写操作 2 流的分类 按照流向 可以分为输入流和输
  • 设计模式之访问器模式(Visitor)的C++实现

    1 访问器模式的提出 在软件开发过程中 早已发布的软件版本 由于需求的变化 需要给某个类层次结构增加新的方法 如果在该基类和子类中都添加新的行为方法 将给代码原有的结构带来破坏 同时 也违反了修改封闭 扩展开放的原则 访问器模式可以实现不改
  • Jira项目管理

    目录 需求管理 项目权限管理 sql jira看板设计 sprint需求看板 ALL需求看板 sprint研发看板 需求管理 版本 创建面板 创建 修复版本 只能管理同一个项目下的需求集 Epics 史诗 可以管理跨项目 有不同项目关键字
  • java常混淆知识,Java中==和equals区别

    在Java语言中 和equals都是用来比较两个对象是否相等的操作符 但是它们的比较方式和比较结果有所不同 操作符 操作符用于比较两个对象的引用是否相等 即这两个对象是否是同一个对象的引用 如果两个对象的引用相同 则返回true 否则返回f
  • scala学习-11-package object

    1 概述 Scala 2 8提供包对象 package object 的新特性 什么是包对象呢 按我的理解 根据Scala 一切皆对象 设计哲学 包 package 也是一种对象 既然是对象 那么就应该有属性和方法 也可以在包对象内声明某个
  • Sublime Text3 快速格式化代码

    英文版 打开Sublime软件 PreFerences gt Key Bindings User 如图 添加代码 keys alt shift f command reindent 保存即可 alt shift f 可以自己改为任意键的组合
  • 深入学习jquery源码之is()与not()

    深入学习jquery源码之is 与not is expr obj ele fn 概述 根据选择器 DOM元素或 jQuery 对象来检测匹配元素集合 如果其中至少有一个元素符合这个给定的表达式就返回true 如果没有元素符合 或者表达式无效
  • three.js ThreeBSP(多个模型组合:差集、交集、并集 附带demo) - 05

    文章目录 一 什么是模型运算 1 函数属性介绍 2 代码示例 二 模型组合demo 需要在我的第一节中找到对应的库 或者私信我 2 代码效果 2 1并集效果 2 2 差集效果 2 3 交集效果 一 什么是模型运算 我所理解的ThreeBSP
  • InfluxDB 的 InfluxQL 基本介绍与使用

    前言 本文主要介绍 InfluxDB 的 InfluxQL 的基本概念与用法并且包含了一些需要注意的点 由于 InfluxDB 2 x 不使用 InfluxQL 进行查询 如您的版本大于 2 x 请查找其他资料 主要为以下内容 SELECT
  • Linux-升级CMake版本(Ubuntu18.4)

    一 简介 在一些场景中 因为CMake版本过低而无法编译 此时就需要升级CMake的版本 二 升级 卸载 先卸载旧的cmake sudo apt get autoremove cmake 安装 切换文件夹 cd usr src 下载cmak
  • 数据结构-第三章 栈和队列

    Stack and Queue 栈和队列是逻辑上的结构 在物理上可以用数组和链表来实现 1 栈 A stack is a list in which insertions and deletions take place at the sa
  • 逆向爬虫31 某站刷播放

    逆向爬虫31 某站刷播放 目标 利用爬虫模拟某站视频播放 增加视频的播放量 思考 正常用户是如何为视频增加播放量的 进入视频播放页 点击播放按钮 视频开始播放 就会增加一个播放量 因此我们只需要模拟点击播放按钮时 浏览器对服务器发送的数据包
  • python 字符串True,False转换成布尔值True,False

    字符串True False转换成布尔值True False不能用bool函数 因为得到的结果都是布尔值True 可以写个if判断 if ss True ss True elif ss False ss False
  • MySQL基本命令

    登录mysql hhostname Pport uusername p 比如 mysql hlocalhost P3306 uroot p 主机名 端口号 用户名 密码 同一台服务器上前两个省略 显示所有数据库 show databases
  • zabbix监控nginx状态界面

    文章目录 开启状态界面 监控nginx状态界面 开启状态界面 实例 开启status location status stub status on off allow 172 16 0 0 16 deny all 访问状态页面的方式 htt
  • 编译工具 Ninja 介绍

    什么是Ninja Ninja是使用C 写的开源项目 http martine github io ninja 在Unix Linux下通常使用Makefile来控制代码的编译 但是Makefile对于比较大的项目有时候会比较慢 看看上面那副