雖然現在計算機的運算速度不斷提高, 但大型軟件的編譯速度仍然是個漫長的過程,我所在的項目, 軟件大小約為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
IncrediBuild聯合編譯的使用
分類: incredibuild3_302009-06-15 17:32 1612人閱讀 評論(0) 收藏 舉報
聯合編譯的意義在於充分利用網格中的閑置電腦資源提高我們的編譯效率。它主要由Agents和Coordinator Server組成。Agents主要作為工作機,分配出來的計算工作在這些電腦上完成。Coordinator Server負責分配工作,協調網絡中的各個電腦的性能均衡。
聯合編譯的功能引入分為下面幾個要素:
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;
}
1.2. 確認聯合編譯環境
接着系統開始檢查聯合編譯器以及系統是否支持聯合編譯,請看下面腳本的檢查。首先,腳本執行命令“$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等語言的編譯器使用聯合編譯。
Xoreax IncrediBuild
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的安裝文件及試用期時間復位工具






