其他分享
首页 > 其他分享> > 笔记 fastbuild

笔记 fastbuild

作者:互联网

笔记_fastbuild

目录


1 基本介绍

1.1 fastbuild介绍

1.1.1 作用

FastBuild 是一个针对 Windows、 Linux 和 OS x 的高性能、开源的构建系统,它支持高度可伸缩的编译、缓存和网络分布。
就是分布式编译,也叫联合编译,加快编译速度的。
原本一个项目只能用自己机器上的核来编,但太慢了,尤其是大型项目,有时候一不小心点个rebuild就,,,就可以点杯奶茶喝到下班了。
联合编译可以让你用其它机器上的核来编,理论上贡献出来的核越多,编得应该就越快。
c++在windows上用得比较多的联编工具主要是IncrediBuild、FastBuild,在linux上一般是用distcc、icecream。

1.1.2 优势

1.2 工作原理

需要编译项目的机器暂且叫主机,能贡献出来用的机器叫工作机
主机用命令 fbuild.exe fbuild.bff -dist 启动编译,工作机要启动 FBuildWorker.exe。
在fbuild.bff中描述了这个c++项目的编译过程,也就是指定编译器路径、链接器路径、包含目录、库目录、源代码目录、编译参数等等一些编译必要的信息,和CMakeLists.txt有点类似。
工作机通过写入一个令牌到一个共享文件夹来表示它们可以贡献出来给别人用,主机通过检查这个文件夹里的令牌来找到可用的工作机,然后Fastbuild会将主机上的编译器工具链同步到工作机上,再接着把可以给工作机编译的源文件发过去,工作机把源文件编译成obj再发回给主机。

1.3 版本配置和项目环境

我用的win7的64位电脑,VS2013,lib库和dll都有,要编的项目是需要生成32位的exe,fastbuild是v1.00版本。
我们项目组windows下联编原本用的是IncrediBuild 5.0,但这个版本只能在win7上用,而且会和windows一些自动更新的补丁冲突导致不能联编。用win10又用不了IncrediBuild,得花钱,最后能联编的win7电脑起来越少,就只能去搞fastbuild。
很奇怪在网上搜到的资料很少,官网资料反而是最有用的,按理说这种能加快编译速度的东西应该有挺多人用的,难道都是用的IncrediBuild吗?
还好之前项目组里有个大佬搞了个半成品,在他的基础上改出来的。


2 文件脚本

https://github.com/sbfhy/note_fastbuild


3 具体实现步骤

3.1

3.2 工作机上操作

3.3 主机上操作


4 遇到的问题

4.1 mspdb120.dll丢失,无法加载 mspdbst.dll (错误代码: 193)

https://www.azdll.net/files/mspdb120-dll 下载
注意版本问题,32位复制到C\Windows\System32,64位复制到C\Windows\SysWOW64。
打开“开始-运行-输入regsvr32 mspdb120.dll。
打开“开始-运行-输入regsvr32 mspdbst.dll。
120是VS2013用的,其它版本不是这个,看具体报错具体解决吧。

4.2 x86和x64问题

我用的amd64_x86,编译器cl.exe、链接器link.exe、库生成器lib.exe都要改成相对应的路径。
fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突:
这种问题大概率是用的lib库和dll库在生成时的位数不对,要和你项目生成的位数对应,就是链接器选项和库生成器选项中的' /MACHINE:X86',意思是指定目标计算机。

4.3 #ifdef WIN32 没用

要加编译选项,' /D "WIN32"'
__DEBUG,release也是类似

4.4 包含目录问题,error LNK2019: 无法解析的外部符号

4.5 编出来的.obj太大了。

生成出来的.obj文件大小是正常的5倍多,因为加了 ' /Z7' 参数,加了调试信息, 生成包含用于调试器的完整符号调试信息的.obj文件,不生成任何 .pdb 文件。

4.6 编译器把警告或者不安全的用法当成错误停止编译

加上 ' /D "_SCL_SECURE_NO_WARNINGS"' 编译参数忽略掉

4.7 error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”

工程的运行库设置不一样,加上一样的编译参数就好了,多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)、单线程(/ML)、单线程调试(/MLd)

4.8 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [17]”转换为“LPCTSTR”

把“字符集”改为“使用多字节字符集”,也就是不要加编译参数 /D "UNICODE"。

4.9 无法连接上工作机

可以通过cmd,输入命令netstat -an |findstr 31264,查看socket连接。
正常连接上了,在界面上也是会有Connections提示的:

4.10 连接上了工作机,但不能用工作机的核来编

编译器的环境没有同步过去,环境包括编译器和需要的dll,需要的dll一般都在cl.exe的同级目录下。
参考 https://www.fastbuild.org/docs/functions/compiler.html
对于MSVC编译器:
  /ZW 选项不能使用
  预编译头文件不能被分发,他们是因机器而异的。(使用了PCH的对象可以被分发)
  /clr 选项不能使用,因为微软编译器的预处理器有bug。
如果连接上了工作机编译,会打出 REMOTE 日志:
Obj: C:\Test\tmp\x86-Profile\TestFramework\Unity1.obj <REMOTE: 192.168.0.8>

4.11 用fbuild 编译完,想在VS里进行调试,但是点了F5后,VS会再次编译项目

这是因为bff配置没有和vs配置完全一样导致的,可以选择attch调试。

4.12 std::max 无法和宏定义区分

(std::max),
(std::numeric_limits<UINT32>::max) error C2589: “(”:“::”右边的非法标记
error C2440: “<function-style-cast>”: 无法从“overloaded-function”转换为“UINT32” 上下文不允许消除重载函数的歧义

4.13 VS的一些宏要修改,依赖库要添加


5 扩展

5.1 FASTBuildMonitor

下载 fastbuild monitor,VS编译可视化插件,这个挺有用的,可以看到在主机的VS上看到其它工作机的编译进度情况。
报错
查看这个xml最后的报错,缺少了一个VS2015的dll:

<entry>
    <record>911</record>
    <time>2020/05/26 13:50:22.457</time>
    <type>Error</type>
    <source>VisualStudio</source>
    <description>End package load [FASTBuildMonitorPackage]</description>
    <guid>{73DE7C44-188B-45D3-AAB2-19AF8724C5C9}</guid>
    <hr>80004005 - E_FAIL</hr>
    <errorinfo>未能加载文件或程序集“Microsoft.VisualStudio.Shell.14.0, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。</errorinfo>
  </entry>

装个VS2015就有用了。。。

5.2 命令行参数

参考 https://www.fastbuild.org/docs/options.html

5.2.1 fbuild.exe

-dist : 开启分布式编译
-cache : 使用构建缓存
-config file.bff : 指定使用的bff文件,如果不用这个参数,就默认是同目录下的fbuild.bff
-j2 : 限制本地只用2个核,没那么卡
-monitor : 输出一个机器可读的文件,供第三方工具使用,FASTBuildMonitor就要加这个
-clean : 清理
-debug : 允许在启动时立即附加调试器(仅限windows)
-nostoponerror : 出错不要停止构建

5.2.2 FBuildWorker.exe

-console : 控制台模式启动,并且隐藏了窗口,启动后只在任务管理器中才能被看到(仅限windows)
-cpus=[n|-n|n%] : 分配工作的cpu
-mode=[disabled|idle|dedicated|proportional] : 设置启动后模式


6 参考资料

https://www.fastbuild.org/docs/documentation.html 官方文档,必看
https://github.com/fastbuild/fastbuild github源代码
https://www.cnblogs.com/tangxin-blog/p/8635438.html 初识FASTBuild 一个大幅提升C/C++项目编译速度的分布式编译工具
https://www.cnblogs.com/tangxin-blog/p/8653715.html 在FASTBuild中使用Distribution
https://github.com/yass007/FASTBuildMonitor fastbuild monitor
https://www.bilibili.com/video/av70564103/ B站视频,UE4#C++#20-FastBuild编译环境
https://github.com/hillin/FASTBuild-Dashboard 面板,就是好看一点
https://github.com/LendyZhang/msfastbuild Utility to build Visual Studio solutions and projects with FASTBuild, supports VS2015/2017/2019.
https://www.cnblogs.com/Shaojunping/p/11941712.html fastbuild联编ue4 shader的使用
https://lab.uwa4d.com/lab/5b85620802004fb65975b1f1 允许使用VS2015/VS2017和Windows 10下的FASTBuild构建虚幻引擎






标签:exe,bff,笔记,dll,编译,https,fastbuild
来源: https://www.cnblogs.com/sbfhy/p/13046658.html