http://www.cnblogs.com/seebro/archive/2013/06/03/3115877.html
虽然现在计算机的运算速度不断提高, 但大型软件的编译速度仍然是个漫长的过程,我所在的项目, 软件大小约为200K行, 在VC6下的编译时间为3分钟(P4 1.8G, 512M), 在交叉编译时更慢, 提高编译速度将能够直接提高前期调测的效率. 本文将介绍提高编译速度的有效方法之一 - 分布式编译.
分布式编译的原理很简单, 就是将编译的整个工作量通过分布计算的方法分配到多个计算机上执行, 这样可以获得极大的效率提升. 由于分布式计算的技术相对成熟, 现在可以见到的分布式编译软件也较多. 一般来说, 一个分布式编译软件不是一个编译器, 而是附着在某个编译器上的分布计算管理软件, 使得对于特定的编译器可以实现分布式编译.
常见的分布式编译器通常是对应于特定的C/C++编译器, 如Gcc, Visual C++, 因为这些编译器使用相当广泛且开放度高. 因而实现分布式编译的意义更大. 下面分别以Visual C++和Gcc为例说明两个典型的分布式编译软件:
1)IncrediBuild
这是一个对应Visual C++ 的分布式编译软件, 通过Visual C++强大的IDE扩展功能, 它有着非常友好的界面, 可以将整个分布式编译过程直观的展现给用户, 并且它通过一个"虚拟机"的技术, 使能编译的参与者可以与编译发起者有着不同的系统配置(Windows操作系统版本, 库文件等), 甚至无需在参与者机器上安装Visual C++.
IncrediBuild需要一个特定的计算机做仲裁者, 其他的所有计算机作为客户, 有了仲裁者的好处是, 可以有它来统一安排所有客户端所发起的编译请求, 一旦某个客户发起编译请求, 则仲裁者会根据其他客户的CPU空闲情况而安排分布式编译, 当多个客户同时发起编译请求时, 仲裁者会自动平衡分布计算负担,使得编译参与者不会占用过多的CPU.
在我们的项目中, 使用IncrediBuild的结果如下:
未使用: 3分钟
5客户: 40秒
10客户: 25秒
可见IncrediBuild对编译性能的巨大提升, 并且在取得如此性能提升的同时, 仲裁者和编译参与者的CPU占用率很低. 保持相当高的可用性, 这是很难得的.
IncridiBuild的缺点是目前仅支持Visual C++ 6编译器和.Net编译器, 也仅适用于Windows平台. 适用范围相对较窄.
2)DistCC
这是一个GNU的分布式C++编译器, 适用于一切Gcc兼容的C++编译器, DistCC也具有很好的跨平台特性, 支持Linux, XFree86, CygWin等平台. 使用范围相当广泛.
DistCC和IncrediBuild的差别在与DistCC不使用仲裁者, 直接由客户端对其他客户端发起编译请求. 所以每个客户端都需要知道其他客户端的位置, 并且当多个客户发起编译请求时不易做平衡处理.
下面说一下怎样利用increbuild实现分布式编译
1.make文件夹里面的Gsm2.mak修改make工具的编译项为IncredBuild增加运行参数
#@echo tools/make.exe -fmake/comp.mak -r -R COMPONENT=$* ... $(strip $(COMPLOGDIR))/$*.log
@if /I %OS% EQU WINDOWS_NT /
(if /I $(BM_NEW) EQU TRUE /
(XGConsole /command="tools/make.exe -fmake/comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log 2>&1" /NOLOGO /profile="tools/XGConsole.xml") /
else /
(XGConsole /command="tools/make.exe -fmake/comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log 2>&1" /NOLOGO /profile="tools/XGConsole.xml") /
) /
else /
(if /I $(BM_NEW) EQU TRUE /
(tools/make.exe -fmake/comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log) /
else /
(tools/make.exe -fmake/comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log) /
)
@type $(strip $(COMPLOGDIR))/$*.log >> $(LOG)
@perl ./tools/chk_lib_err_warn.pl $(strip $(COMPLOGDIR))/$*.log
2.tools工具夹里面加入 XGConsole.xml
内容为
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
<Tools>
<Tool Filename="perl" AllowRemote="true" />
<Tool Filename="make" AllowIntercept="true" />
<Tool Filename="tcc" AllowRemote="true" />
<Tool Filename="tcpp" AllowRemote="true" />
<Tool Filename="armcc" AllowRemote="true" />
<Tool Filename="armcpp" AllowRemote="true" />
<Tool Filename="strcmpex" AllowRemote="true" />
<Tool Filename="warp" AllowRemote="true" />
<Tool Filename="armar" AllowRemote="false" />
<Tool Filename="formelf" AllowRemote="false" />
</Tools>
</Profile>
3.tools工具夹里面的make2.pl修改以下几行
if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") ||
($action eq "c,r") || ($action eq "c,u"))
{
if ($ENV{"NUMBER_OF_PROCESSORS"} > 1)
{
if ($fullOpts eq "")
{
$fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
}
else
{
$fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
}
}
}
改为
if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") ||
($action eq "c,r") || ($action eq "c,u"))
{
if ($ENV{"NUMBER_OF_PROCESSORS"} >= 1)
{
if ($fullOpts eq "")
{
$fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}"."0";
}
else
{
$fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}"."0";
}
}
}
$ENV{"NUMBER_OF_PROCESSORS"} = 10; //修改为你想要的进程数
4.把tools里面的make.exe换成多任务的文件
联合编译的功能引入分为下面几个要素:
1. 使能或禁止联合编译功能;
2. 检查XGC是否存在;
3. 定义可用的进程数;
4. 中间编译文件;
5. 编译命令;
1.1. 使能或禁止联合编译的参数设定
对于MTK平台,可以通过命令行方式参数“-disable_ib”,“-no_ib”或“-bm”。我们可以通过查看脚本make2.pl确认。
}elsif ($ARGV[0] =~ /-disable_ib/i)
{
$disable_ib = 1;
}elsif ($ARGV[0] =~ /-no_ib/i)
{
$disable_ib = 1;
} elsif ($ARGV[0] =~ /-bm/i)
{
$disable_ib = 1;
}
确认联合编译环境
接着系统开始检查联合编译器以及系统是否支持联合编译,请看下面脚本的检查。首先,脚本执行命令“$exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`;”,确认是否存在联合编译器。
my $no_of_proc=1;
my $exec_xgc_result=999;
# $exec_xgc_result = system("XGConsole /NOLOGO /SILENT tools//XGC_Test.xml /n");
$exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`;
if ("$exec_xgc_result" ne "")
{
$exec_xgc_result=99;
# print "XGConsole not found";
} else
{
if (("$ENV{/"TERM/"}" eq "") && ("$ENV{/"USERDOMAIN/"}" eq "DOMAIN_MTK"))
{
$disable_ib = 1;
print " WARNING: XGConsole is supported but it's NOT in telnet mode. TERM is not defined! /n";
}
if ($disable_ib==0)
{
$exec_xgc_result=0;
# print "XGConsole found";
} else
{
$exec_xgc_result=99;
}
}
其中,XGC_Test.xml是比较简单的。然后,通过环境变量确认OS是否支持联合编译。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<BuildSet>
<Environments>
</Environments>
</BuildSet>
下面的脚本是用来确认对VC++的联合编译特性的支持的。
my $exec_buildconsole=999;
#$exec_buildconsole = system("BuildConsole /n");
$exec_buildconsole = `BuildConsole 2>&1`;
if ($exec_buildconsole =~ /IncrediBuild/)
{
if ( "$ENV{/"TERM/"}" eq "" )
{
$disable_ib = 1;
print " WARNING: BuildConsole is supported but it's NOT in telnet mode. TERM is not defined! /n";
}
if ($disable_ib==0)
{
$exec_buildconsole=0;
#print "/nBuildConsole found";
} else
{
$exec_buildconsole=99;
}
} else
{
$exec_buildconsole=99;
#print "/nBuildConsole not found";
}
if ( $exec_buildconsole==0 ) # support BuildConsole
{
system "perl tools//RunMsdev.pl";
$msdev = 'BuildConsole msdev';
} else # not support BuildConsole
{
$msdev = 'msdev';
}
1.3. 定义进程数
根据CPU个数设定编译可创建的进程数,一般双核CPU的进程数设为4各基本均衡了。
if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") ||
($action eq "c,r") || ($action eq "c,u") || ($action eq "scan"))
{
if ($ENV{"NUMBER_OF_PROCESSORS"} > 1)
{
if ( $exec_xgc_result==0 )
{
$no_of_proc = $ENV{"NUMBER_OF_PROCESSORS"}*2;
if ($fullOpts eq "")
{
$fullOpts = "CMD_ARGU=-j$no_of_proc";
} else
{
$fullOpts .= ",-j$no_of_proc";
}
} else
{
if ($fullOpts eq "")
{
$fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
} else
{
$fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
}
}
MTK还提供了通过“-o|-op|opt”来设定进程数。
if ($fullOpts ne "") {
# Fix build errors when "parallel jobs processing" fuction enabled by argument "-o|-op|-opt" in command line
my @temp = @mOpts;
@mOpts = ();
foreach (@temp)
{
if ($_ =~ /^/s*(-j|--jobs)/)
{
$fullOpts .= ",$_";
}
else
{
push(@mOpts,$_);
}
}
# End
$fullOpts =~ s/"///"/g;
$fullOpts = "/"$fullOpts/"";
$fullOpts =~ s/,/ /g;
$makeCmd .= " " . join(" ", @mOpts) . " $fullOpts ";
}
1.4. 中间编译文件
中间编译文件intermed.mak包括了需要编译各个模块的依赖关系和编译方法。
1.5. 编译命令
(if /I $(BM_NEW) EQU TRUE /
(XGConsole /command="tools/make.exe -fmake/intermed.mak -k -r -R $(strip $(CMD_ARGU)) " /NOLOGO /profile="tools/XGConsole.xml" ) /
else /
(XGConsole /command="tools/make.exe -fmake/intermed.mak -r -R $(strip $(CMD_ARGU)) " /NOLOGO /profile="tools/XGConsole.xml" ) /
) /
其中,XGConsole.xml规定了各种编译工具的是否支持远程工作和是否允许分段处理的特性。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
<Tools>
<Tool Filename="perl" AllowRemote="true" />
<Tool Filename="make" AllowIntercept="true" />
<Tool Filename="tcc" AllowRemote="true" />
<Tool Filename="tcpp" AllowRemote="true" />
<Tool Filename="armasm" AllowRemote="true" />
<Tool Filename="armcc" AllowRemote="true" />
<Tool Filename="armcpp" AllowRemote="true" />
<Tool Filename="strcmpex" AllowRemote="true" />
<Tool Filename="warp" AllowRemote="true" />
<Tool Filename="armar" AllowRemote="false" />
<Tool Filename="fromelf" AllowRemote="false" />
</Tools>
</Profile>
按照Xoreax IncrediBuild的说明我们可以在用GNUMAKE等语言的编译器使用联合编译。
IncrediBuild 试用时间推迟的算法
EXTERN_C void GetIncrediBuildLicKey(DATE date, LPTSTR lpszKey, UINT cchMax)
{
BYTE * pByte = (BYTE *)&date;
BYTE * T1 = (BYTE *) (pByte);
BYTE * T2 = (BYTE *) (pByte + 2);
DWORD dwM1 = (DWORD) *pByte;
dwM1 *= (DWORD) *(pByte + 1);
dwM1 *= (DWORD) *(pByte + 2);
dwM1 *= (DWORD) *(pByte + 3);
WORD wM2 = (WORD) *(pByte + 4);
wM2 *= (WORD) *(pByte + 5);
WORD wM3 = (WORD) *(pByte + 6);
wM3 *= (WORD) *(pByte + 7);
TCHAR szOut[MAX_PATH] = { 0 };
wsprintf(szOut, _T("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"),
dwM1,
wM2,
wM3,
*T1, *(T1+1),
*T2, *(T2+1), *(T2+2), *(T2+3), *(T2+4), *(T2+5)
);
lstrcpyn(lpszKey, szOut, cchMax);
}
以上代码调用方法:
void CCrackibDlg::OnButton1()
{
COleDateTime destTime = COleDateTime::GetCurrentTime();
COleDateTime dateTime(destTime.GetYear(), destTime.GetMonth()+1, destTime.GetDay()-1, 23, 59, 59);
DATE Date = (DATE)dateTime;
TCHAR szOut[MAX_PATH] = { 0 };
GetIncrediBuildLicKey((DATE)Date, szOut, MAX_PATH);
SetDlgItemText(IDC_EDIT1, szOut);
}
-------------------------------------------------------------------------------
这些天对IncrediBuild进一步研究了其软件安全保护措施,发现3.40版本与前几个版本很相似,只是对于试用版有效期限保护的密文更换了在注册表中的位置。下面我详细解释我这两天的研究过程,希望对大家有帮助。
1.打开注册表监督程序,查看已安装IncrediBuild的“关于”对话框,发现它会去取注册表的键值:
HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}
"Field"
HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}/NumMethods
"4"
HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}/ProxyStubClsid32
"{M1-M2-M3-T1-T2}"
2.当我把ProxyStubClsid32的键值修改为“0”,查看IncrediBuild的“关于”对话框,提示我过期时间为1899-12-30;
3.删除HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}整个项目,查看IncrediBuild的“关于”对话框,提示我证书无效;
4.卸载IncrediBuild后,并将电脑时间设置到2100年,再安装软件,安装完成后,提示我过期时间为2100年某年某月,但软件仍为过期不能使用。
5.通过上面的实验可以肯定的是在试用版授权模式下,试用期确定为30天,当前时间与过期时间相差大于30天,都认为过期。可过期时间的密文的位置已经让我们发现,我们可以在不改变授权模式的情况下,总取更新过期时间也能达到延长软件使用的效果。
看过网上一些文章说,其证书是RSA签出的证书,要么修改软件中的公钥去更换加密密钥,这样影响颇大。幸好,网上有高手给出了3.31的过期时间密文的加密算法,那让我们来冲浪一下吧。破解方案确定为重置试用期时间。
编码,测试,单调却有那么点诱惑的成就感:
整个破解程序的流程为:
1.调用GetLocalTime获取当前时间;
2.做计算当前日期后若干天数的算法:
unsigned char month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
days = curday + offset;
for(months = curmonth -1; ; months++)
{
years = curyear + months/12;
if(curyear%4)
month_days[1] = 28;
else
month_days[1] = 29;
if(days <= month_days[months%12])
break;
days -= month_days[months%12];
}
curyear = years;
curmonth = months%12 + 1;
curday = days;
3.过期时间密文算法:
COleDateTime Date(curyear, curmonth, curday, curhour, curmin, cursec);
DATE Date = (DATE)DateTime;
memcpy(buf, &Date, sizeof(Date));
memcpy(&T1, &buf[0], 2);
memcpy(&T2, &buf[2], 6); //注意T2应该用LONG64声明
M1 = buf[0] * buf[1] * buf[2] * buf[3];
M2 = buf[4] * buf[5];
M3 = buf[6] * buf[7];
在字符转换的时候需要注意一些小细节,特别是T2。大家验证该算法的时候可以拿这个数据做验算.
2008-5-30-23-59-59
T1 = 0x37BA
T2 = 0xE7FFDF55E340
M1 = 0x23EAE06
M2 = 0x4A0B
M3 = 0x38C0
4.操作注册表
RegCreateKey, RegSetValue, RegCloseKey
5.重启IncrediBuild服务:
服务名:IncrediBuild_Agent
服务显示名:IncrediBuild Agent
OpenSCManager, OpenService, ControlService, QueryServiceStatus, StartService, CloseServiceHandle
IncrediBuild破解+3.51版本下载:http://download.csdn.net/source/3331797
分类: incredibuild3_302009-06-15 17:32 1612人阅读 评论(0) 收藏 举报
联合编译的意义在于充分利用网格中的闲置电脑资源提高我们的编译效率。它主要由Agents和Coordinator Server组成。Agents主要作为工作机,分配出来的计算工作在这些电脑上完成。Coordinator Server负责分配工作,协调网络中的各个电脑的性能均衡。
联合编译的功能引入分为下面几个要素:
1. 使能或禁止联合编译功能;
2. 检查XGC是否存在;
3. 定义可用的进程数;
4. 中间编译文件;
5. 编译命令;
对于MTK平台,可以通过命令行方式参数“-disable_ib”,“-no_ib”或“-bm”。我们可以通过查看脚本make2.pl确认。
} elsif ($ARGV[0] =~ /-disable_ib/i) {
$disable_ib = 1;
} elsif ($ARGV[0] =~ /-no_ib/i) {
$disable_ib = 1;
} elsif ($ARGV[0] =~ /-bm/i) {
$disable_ib = 1;
}
接着系统开始检查联合编译器以及系统是否支持联合编译,请看下面脚本的检查。首先,脚本执行命令“$exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`;”,确认是否存在联合编译器。
my $no_of_proc=1;
my $exec_xgc_result=999;
# $exec_xgc_result = system("XGConsole /NOLOGO /SILENT tools//XGC_Test.xml /n");
$exec_xgc_result = `XGConsole /NOLOGO /SILENT /NOWAIT tools//XGC_Test.xml 2>&1`;
if ("$exec_xgc_result" ne "")
{
$exec_xgc_result=99;
# print "XGConsole not found";
} else
{
if (("$ENV{/"TERM/"}" eq "") && ("$ENV{/"USERDOMAIN/"}" eq "DOMAIN_MTK"))
{
$disable_ib = 1;
print " WARNING: XGConsole is supported but it's NOT in telnet mode. TERM is not defined! /n";
}
if ($disable_ib==0)
{
$exec_xgc_result=0;
# print "XGConsole found";
} else
{
$exec_xgc_result=99;
}
}
其中,XGC_Test.xml是比较简单的。然后,通过环境变量确认OS是否支持联合编译。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<BuildSet>
<Environments>
</Environments>
</BuildSet>
下面的脚本是用来确认对VC++的联合编译特性的支持的。
my $exec_buildconsole=999;
#$exec_buildconsole = system("BuildConsole /n");
$exec_buildconsole = `BuildConsole 2>&1`;
if ($exec_buildconsole =~ /IncrediBuild/)
{
if ( "$ENV{/"TERM/"}" eq "" )
{
$disable_ib = 1;
print " WARNING: BuildConsole is supported but it's NOT in telnet mode. TERM is not defined! /n";
}
if ($disable_ib==0)
{
$exec_buildconsole=0;
#print "/nBuildConsole found";
} else
{
$exec_buildconsole=99;
}
} else
{
$exec_buildconsole=99;
#print "/nBuildConsole not found";
}
if ( $exec_buildconsole==0 ) # support BuildConsole
{
system "perl tools//RunMsdev.pl";
$msdev = 'BuildConsole msdev';
} else # not support BuildConsole
{
$msdev = 'msdev';
}
根据CPU个数设定编译可创建的进程数,一般双核CPU的进程数设为4各基本均衡了。
if (($action eq "update") || ($action eq "remake") || ($action eq "new") || ($action eq "bm_new") ||
($action eq "c,r") || ($action eq "c,u") || ($action eq "scan")) {
if ($ENV{"NUMBER_OF_PROCESSORS"} > 1) {
if ( $exec_xgc_result==0 )
{
$no_of_proc = $ENV{"NUMBER_OF_PROCESSORS"}*2;
if ($fullOpts eq "") {
$fullOpts = "CMD_ARGU=-j$no_of_proc";
} else {
$fullOpts .= ",-j$no_of_proc";
}
} else {
if ($fullOpts eq "") {
$fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
} else {
$fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}";
}
}
}
}
MTK还提供了通过“-o|-op|opt”来设定进程数。
if ($fullOpts ne "") {
# Fix build errors when "parallel jobs processing" fuction enabled by argument "-o|-op|-opt" in command line
my @temp = @mOpts;
@mOpts = ();
foreach (@temp)
{
if ($_ =~ /^/s*(-j|--jobs)/)
{
$fullOpts .= ",$_";
}
else
{
push(@mOpts,$_);
}
}
# End
$fullOpts =~ s/"///"/g;
$fullOpts = "/"$fullOpts/"";
$fullOpts =~ s/,/ /g;
$makeCmd .= " " . join(" ", @mOpts) . " $fullOpts ";
}
中间编译文件intermed.mak包括了需要编译各个模块的依赖关系和编译方法。
(if /I $(BM_NEW) EQU TRUE /
(XGConsole /command="tools/make.exe -fmake/intermed.mak -k -r -R $(strip $(CMD_ARGU)) " /NOLOGO /profile="tools/XGConsole.xml" ) /
else /
(XGConsole /command="tools/make.exe -fmake/intermed.mak -r -R $(strip $(CMD_ARGU)) " /NOLOGO /profile="tools/XGConsole.xml" ) /
) /
其中,XGConsole.xml规定了各种编译工具的是否支持远程工作和是否允许分段处理的特性。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
<Tools>
<Tool Filename="perl" AllowRemote="true" />
<Tool Filename="make" AllowIntercept="true" />
<Tool Filename="tcc" AllowRemote="true" />
<Tool Filename="tcpp" AllowRemote="true" />
<Tool Filename="armasm" AllowRemote="true" />
<Tool Filename="armcc" AllowRemote="true" />
<Tool Filename="armcpp" AllowRemote="true" />
<Tool Filename="strcmpex" AllowRemote="true" />
<Tool Filename="warp" AllowRemote="true" />
<Tool Filename="armar" AllowRemote="false" />
<Tool Filename="fromelf" AllowRemote="false" />
</Tools>
</Profile>
按照Xoreax IncrediBuild的说明我们可以在用GNUMAKE等语言的编译器使用联合编译。
Xoreax IncrediBuild是分布式编译(多线程处理)技术,我们也称之为联合编译.如果局域网内存在多台电脑安装了这个,在编译C/C++时,它会使用空闲的CPU一起编译,大大缩短了编译的时间,对于大工程来说,是一件非常爽的事情.
IncrediBuild分为服务端(Coordinator)和客户端(Agent).简单的理解是服务端是协调任务的分配,客户端把分到手的任务编译后再返还回去.注意的是,服务端只负责分配工作,之后者最客户端之间P2P的操作,如果二个客户端建立好链接后,此时再与服务端断开也不会影响他们之间的编译了.
1) 服务端(Coordinator)的安装:
运行IncrediBuild安装程序,选择Install IncrediBuild,并点Next下一步.同意那什么License Agreement继续下一步.来到安装组件选择(Component Selection).这里做为服务端我们要钩先上IncrediBuild Coordinator.这里是一个复选框,一般来说服务端也可以参与编译工作,如果不想让服务端参与编译工作的话,就把上面的IncrediBuild Agent前的钩点掉就可以
继续下一步,选择安装路径,和使用的一些端口号.参与编译的CPU数(这个只有钩选了Agent后才会有)等,这些使用默认的就可以了.之后安装完成.IncrediBuild的服务端就安装好了.
2) 客户端(Agent)的安装:
在其它的电脑上,运行IncrediBuild的安装程序,运行到安装组件选择(Component Selection),只钩选IncrediBuild Agnet并下一步
选择安装路径,并下一步.在这要填入服务端的IP地址和端口号.
填好之后下一步,它会与服务器进行验证一下.然后设置一下编译通讯的端口之类的.这与网内安装的其它的一至就行了,一般情况都使用默认.然后选择参与编译的CPU数.最后安装就行了.
到这步,基本上服务器与客户端都安装完成.在Coordinator Monitor中可以看到各成员的状态.
打开VS你将会发现菜单栏上多出了一项IncrediBuild的选项.这就是那个所谓的联合编译了.
找个工程试一下就知道了.
附上IncrediBuild的安装文件及试用期时间复位工具