IncrediBuild 联合编译

2023-11-06

01 基本信息

官网: https://www.incredibuild.com

Make 和其他构建工具示例

要使用IncrediBuild,必须有License,可以免费申请试用版本的license。
可以到 https://www.incredibuild.com/free-trial-2 去申请30天免费 的 license,申请时需要手机号码和邮件。申请后可以下载安装包。也可以直接使用 visual studio 2019 安装包中的 incredibuild。

01.01 安装方法

01.01.01 使用独立安装包的安装
截至20210624,最新版本是9.50(incredibuild9_50.exe)。

选择 Custom 中的 客户端【Incredibuild Agent】 和 服务端【IncrediBuild coordinator】。

Incredibuild Agent 是联合编译的客户端,可以参与发起联合编译请求和为其他联合编译请求贡献cpu算力。

Incredibuild Coordinator 是联合编译服务端。用来管理和协调联合编译。

visual studio 2019

01.01.02 使用vs安装包安装(推荐)

选择 vs安装的 单个组件 ⇒ 编译器、生成工具和运行时 ⇒ IncrediBuild - 生成加速。这个选项直接包含 [Incredibuild Agent] 和 [IncrediBuild coordinator]。

注意,IncrediBuidl,用vs安装,需要用vs卸载。
使用 vs 单个组件安装时,建议安装 英文语言包。

在这里插入图片描述
安装后效果:
系统托盘菜单

VS扩展插件菜单

02 配置信息

详细配置信息可以参考官方文档
https://incredibuild.atlassian.net/wiki/spaces/IUM/pages/11239495/Make+and+Other+Build+Tools+Samples

02.01 导入license文件

选择 [Coordinator Settings] 菜单,在 [ Coordinator Settings] 窗口选择 [License] 列表。点击 [Load License File]按钮,导入自己的License文件。

当不需要该license文件时,点击 [Unload License] 按钮,卸载该 license 文件即可。

导入license文件

02.02 客户端和服务端配置

Agent设置:
[Agent Settings] ==> [Newwork] ==> [Coordinator] ==> [Coordinator Location]
设置 Computer 为 [Coordinator] 的固定IP地址或者 [Coordinator] 的主机名称,即指定服务端的IP地址或者主机名称。
Port端口号:默认 31104
点击 [Test] 按钮,测试连通性

注意:[Initiator] ==> [General] ==> [Enable standalone mode] 这个选项在联合编译时,不要勾选。

准备联合编译时,不要启动 启用独立模式

Coordinator 端设置

端口号使用默认的 31104 即可。
设置服务端端口号
服务端只要设置了License就可以。
[Coordinator Settings] 设置 License ,主要是导入申请到的许可文件。其他项使用默认值即可。

加载License

03 编译设置

03. 01使用 vs2019 中的扩展中 [IncrediBuild] 菜单

使用管理员权限启动vs2019,选择菜单 [扩展] ==> [IncrediBuild] ==> [Build Solution] 即可编译。

03.02 使用命令行

比如 使用cygwin64编译:

::官网参考资料
:: https://incredibuild.atlassian.net/wiki/spaces/IUM/pages/11239495/Make+and+Other+Build+Tools+Samples
:: IncrediBuild 安装包中的参考
:: vs的 nmake 命令
:: C:\Program Files (x86)\IncrediBuild\Samples\Make And Build Tools\Nmake
:: make 命令
:: C:\Program Files (x86)\IncrediBuild\Samples\Make And Build Tools\Make
set cygwindir=D:\cygwin64
set PATH=%cygwindir%\opt\lo\bin;%cygwindir%\bin;%cygwindir%\sbin;%cygwindir%\usr\bin;%cygwindir%\usr\sbin;%cygwindir%\usr\local\bin;%PATH%;
BuildConsole /command="make -rs -f Makefile build" /openmonitor /title="MakeXXXX"

03.03 在 Coordinator Monitor 设置 agent属性

可以在每个agent上面右键菜单中设置属性,比如:建立分组(同组内联合编译),停止订阅、取消订阅、启用、禁用、授予管理员权限等。

04 一些问题

参考:利用IncrediBuild加速NDK编译

04.01 CompareStringA
IncrediBuild : Error: Attempt to call unsupported import function CompareStringA

去掉-j200之后保持现状; 去掉SHELL=cmd之后居然就没这个错了。
怀疑这个是IB自己的BUG…传入的/COMMAND参数里如果带=就会出这个问题,令人智熄。后来验证了下确实是这样,因为传入NDK-DEBUG=1也是一模一样的下场。

04.02 job server
make: INTERNAL: Exiting with 64 jobserver tokens available; should be 1024!

搜了下有人遇到过一样的问题 Make (Parallel Jobs) on Windows

I found this Danny Thorpe’s blog entry that explains the problems with parallel make build on Windows. Basically what it suggests is to set the following environment variable first:
set SHELL=cmd.exe

一路跟进去看了下大致的解释,这就很难搞了…如果不设置SHELL=cmd就无法并行编译,如果设置了就报上一个错。

我一开始试图找除了命令行传参之外有没有其他方法,但是官方文档Choosing the Shell讲的很绝情:

Unlike most variables, the variable SHELL is never set from the environment.

既然改不了IB本身,那就只能对make下手了——首先看下自带的make版本信息

D:\SDK\android-ndk-r21b\prebuilt\windows-x86_64\bin>make --version
GNU Make 4.2.1
Built for x86_64-w64-mingw32
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

OK, 去官网下载对应make 4.2.1,解压之后在Developer Command Prompt for VS 2019里运行build_w32.bat。替换进去发现没啥问题:

D:\SDK\android-ndk-r21b\prebuilt\windows-x86_64\bin>make --version
GNU Make 4.2.1
Built for Windows32
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

强制设置SHELL
翻了下代码发现默认的shell使用的是sh.exe,这里直接改成cmd.exe即可。

--- job.c	Sun May 22 04:22:32 2016
+++ job.c	Tue Mar  2 18:46:55 2021
@@-31,7+31,7@@
 #ifdef WINDOWS32
 #include <windows.h>
 
-const char *default_shell = "sh.exe";
+const char *default_shell = "cmd.exe";
 int no_default_sh_exe = 1;
 int batch_mode_shell = 1;
 HANDLE main_thread;

IB传入参数应该是-j1024,但是windows版本使用的是信号量所以不能超过MAXIMUM_WAIT_OBJECTS即64,所以导致了问题的发生。找到根源之后就好办了:

--- main.c	Tue May 31 15:17:26 2016
+++ main.c	Tue Mar  2 18:57:39 2021
@@-2058,6+2058,7@@
      submakes it's the token they were given by their parent.  For the top
      make, we just subtract one from the number the user wants.  */
 
+  if (job_slots >= MAXIMUM_WAIT_OBJECTS) job_slots = MAXIMUM_WAIT_OBJECTS - 1;
   if (job_slots > 1 && jobserver_setup (job_slots - 1))
     {
       /* Fill in the jobserver_auth for our children.  */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IncrediBuild 联合编译 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • Android自定义RecyclerView实现多级树

    Android自定义RecyclerView实现多级树 在Android开发中 RecyclerView是一个强大灵活的控件 常用于展示大量数据列表 而有时候我们需要实现多级树结构的列表 即每个节点下面可以包含子节点 这时候就需要对Recy
  • shell脚本启动jar包

    bin bash NAME spring admin echo NAME PID ps ef grep NAME grep java grep v grep awk print 2 echo 当前进程号为 PID echo for pid
  • iphone屏蔽系统更新_iphone如何实现永久屏蔽IOS系统更新?

    一直以来苹果的新系统更新覆盖率是全行业最快也是最高的 截止到ios13发布为止 ios12的全网覆盖率已经达到了惊人的90 iphone手机如何永久屏蔽IOS系统更新 对于ios13加入的诸多功能升级以及隐藏的一些不稳定因素 更多用户会选择
  • 线性代数 - 矩阵形式下的最小二乘法

    20201001 0 引言 最近在看 异常点检测 的时候 其中在PCA部分 准确来说是前面一小节 在进行推导的时候 使用了最小二乘法 其实这个东西本质上并不难 但是让我比较尴尬的是 很多线性代数的东西有些遗忘了 好在最近直截了当的复习让大部
  • Python3中with用法

    Python中的with语句用于用上下文管理器 context manager 定义的方法包装块的执行 它允许将常见的try except finally使用模式封装起来以方便重用 在Python中 在处理非托管资源 unmanaged r
  • Idea代码上传至Git完整教程(阿里云)

    项目背景 本期项目是一个数据化应用系统 使用的是idea开发后台 前端使用微信小程序的项目 项目中 为了代码管理方便 使用了阿里云作为代码托管 直接使用idea上传下载代码 本期文章介绍idea上传代码的过程 与大家分享 如有不行详细或错误
  • Python code模块

    code 解释器基类 code 模块提供了在 Python 中实现 read eval print 循环的功能 它包含两个类和一些快捷功能 可用于构建提供交互式解释器的应用程序 class code InteractiveInterpret
  • Kmeans原理公式图文详解

    在网上查看了些博客 感觉大家都对数学公式的解释的比较晦涩 下面我结合一个非常简单的示意图解释下他的数学公式 理解不到位的请留言 kmeans是一种聚类算法下面是算法的描述 给定训练样本是每一个 即每一个样本元素都是n维向量 为了便于理解在后
  • 淘宝淘金币助手,自动完成淘金币任务,蚂蚁庄园和蚂蚁森林,天猫领红包和收取能量

    最新软件下载 详见群文件 长期更新 QQ群号 636677598 或者直接点击链接加群 https jq qq com wv 1027 k 8rmAofkO 微信 baohuikf 1 下载安装金币助手 2 打开无障碍服务和悬浮窗权限 授权
  • Android进阶(五)DataBinding解析

    1 概述 在上篇文章Android进阶 四 LiveData解析中讲到了关于JetPack框架的LiveData解析 这是一个基于ViewModel和观察者模式的实践 这篇文章要讲的DataBinding同样可以认为是基于ViewModel
  • MIB、SIB

    1 1 概述 系统信息分成MasterInformationBlock MIB 和多个SystemInformationBlocks SIBs MIB包括有限个最重要 最常用的传输参数 其需要从该小区中获得其它的信息 同时其在 BCH上进行
  • 还在为ElementUI的原生校验方式苦恼吗,快用享受element-ui-verify插件的快乐吧(待续)

    element ui verify 本文章意在介绍element ui verify插件使用 以及对比elementUI原生校验方式 突显该插件用少量代码也能实现原生的校验效果甚至更好 1 先观察一个示例
  • Maven Helper插件 IDEA配置使用(详细配置)

    转自 https blog csdn net qq 33541575 article details 80211122 配置Maven Helper插件 因为在准备讲Maven用Maven Helper插件的时候 在网上学习 发现资料很少
  • 一个常用的 C++ 学习、了解平台特性和数据类型的小工具(源代码)

    这是一段C 代码 运行后会输出不同数据类型在当前平台下所占字节数 最大值和最小值等信息 具体解释如下 首先 包含两个头文件 iostream 输入输出流的标准头文件 用于标准输入输出 包含定义在 std 命名空间的 cout 和 endl
  • SpringCloud Alibaba之Ribbon 修改和自定义负载均衡策略

    Ribbon 简介 Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具 它基于Netflix Ribbon实现 通过Spring Cloud的封装 可以让我们轻松地将面向服务的REST模版请求自动转换成客户
  • 文件服务器 选择,文件服务器选择

    文件服务器选择 内容精选 换一换 从本地上传日志文件 是指从浏览器所在机器选择日志文件并上传 目前只支持选择 log的日志文件 如果日志文件中包含其他格式文件 则导入时会提示格式错误 如图2所示 单击Upload 则只会上传 log的日志文
  • request.getParameterNames();

    详情查询 J2EE 1 3 1 API
  • 第2章 信息系统集成及服务管理

    本章考试分值 1 2 分 主要考点 1 ITSS 信息技术服务标准 2 信息系统设计 一 信息系统集成及服务管理体系 1 信息系统集成及服务管理体系 了解 信息系统集成及服务是一个范围相当广泛的概念 所有以满足企业和机构的业务发 展所带来的
  • Android平台安全(一)

    刚好五一了 已经过去两三天了 今天接触到了关于Android安全的一些东西 记录下来 Android安全我大致分三个部分来说明 今天我就先说第一个部分 在典型的场景中 安全主要用于解决一下4类需求 保密 鉴别 认证 完整性 不可以否认性 安
  • IncrediBuild 联合编译

    01 基本信息 官网 https www incredibuild com Make 和其他构建工具示例 要使用IncrediBuild 必须有License 可以免费申请试用版本的license 可以到 https www incredi