趙正旭 , 劉 甜, 張登輝
(石家莊鐵道大學(xué) 信息科學(xué)與技術(shù)學(xué)院,河北 石家莊 050043)
基于動態(tài)鏈接庫自動查找的軟件發(fā)布方案
趙正旭 , 劉 甜, 張登輝
(石家莊鐵道大學(xué) 信息科學(xué)與技術(shù)學(xué)院,河北 石家莊 050043)
針對傳統(tǒng)的軟件發(fā)布過程中人工定位主程序依賴動態(tài)鏈接庫的問題,提出了一個基于動態(tài)鏈接庫自動查找的軟件發(fā)布方案。該方案利用perl腳本對程序所依賴的動態(tài)鏈接庫文件進行自動查找,解決了多路徑下同名動態(tài)鏈接庫無法正確定位的問題,并使用開源工具Inno Setup實現(xiàn)了大型軟件系統(tǒng)的發(fā)布。該方案避免了手動查找依賴庫的繁瑣過程,減少了人工干預(yù),降低了開發(fā)人員的系統(tǒng)維護成本,為軟件發(fā)布提供了一種快速有效的途徑,提高了軟件發(fā)布的效率和穩(wěn)定性。
軟件發(fā)布;軟件生命周期;perl腳本
隨著航天事業(yè)的發(fā)展,航天軟件的規(guī)模不斷擴大,載人航天系統(tǒng)中軟件系統(tǒng)功能日益復(fù)雜,程序所占用的計算機空間呈現(xiàn)出越來越大的趨勢,對于這種大型的應(yīng)用軟件而言,大量的分布在計算機不同位置上的文件對軟件的發(fā)布帶來了巨大的困難。航天軟件主要指作為型號組成部分的計算機軟件,包括彈載、星載、箭載等飛行器和地面設(shè)備上的制導(dǎo)、控制、通訊、遙測、遙控、安全控制、外測、作戰(zhàn)管理、測試、診斷、維護軟件等[1]。
當(dāng)前軟件的開發(fā),大多數(shù)是建立在已有的類庫或框架上進行二次開發(fā),這樣既可以快速實現(xiàn)客戶的要求,又可以保證程序的魯棒性。航天可視化操控軟件是在Visual Studio平臺上開發(fā)的,包括任務(wù)管理、用戶管理、文件管理、操控功能等,提供了三維信息顯示和業(yè)務(wù)作業(yè)平臺。這個軟件體系結(jié)構(gòu)龐大,業(yè)務(wù)邏輯復(fù)雜,還用到了第三方軟件OSG和Qt,作為一個部署于前臺圖形工作站的依賴多個第三方庫文件的大型航天軟件,它的安裝部署工作較為頻繁,這對軟件的發(fā)布帶來一定的困難。在對主程序打包時,查找其依賴的動態(tài)鏈接庫就成為一個關(guān)鍵問題。傳統(tǒng)的打包過程需要人工查找這些動態(tài)鏈接庫并拷貝至可執(zhí)行文件所在目錄,這種方法增加了系統(tǒng)的維護成本,而且人工查找的方式不能保證準(zhǔn)確性。為了保證版本的統(tǒng)一性和程序的完整性,實現(xiàn)整個安裝程序的打包發(fā)布,保證安裝過程中安裝、回滾和卸載的統(tǒng)一性,提供給用戶靈活的選擇權(quán),基于perl語言提出了一種自動查找動態(tài)鏈接庫的方法,將上述工程自動化,使系統(tǒng)的發(fā)布過程更加簡潔。這一技術(shù)已應(yīng)用到嫦娥三號可視化系統(tǒng)的軟件發(fā)布之中。
目前,國內(nèi)外對于制作安裝包方面的研究主要熱點在于使用第三方軟件進行二次開發(fā),而市場份額最大的操作系統(tǒng)是Windows,所以有很多軟件是針對Windows操作系統(tǒng)的,它們可以制作出界面友好、功能豐富的安裝包。下面介紹幾種安裝包制作工具及其特點[2],見表1所示。
表1 常用安裝包制作工具及其特點
另外,有些軟件部署工具會集成在應(yīng)用程序開發(fā)平臺中,可以較為容易地制作出由本平臺開發(fā)的應(yīng)用程序的安裝包,因為它會自動去搜索應(yīng)用軟件所需的相關(guān)文件,此類平臺如VC++、Visual Basic和 PowerBuilder 等[3]。但是有些情況下,開發(fā)平臺還是會遺漏文件,它們制作出的安裝包功能比較簡單,安裝界面單一,甚至開發(fā)商的印記一直保留,無法去除。經(jīng)過研究,采用Inno Setup工具來制作航天可視化操控軟件的安裝包。
Inno Setup 是一個制作安裝包的免費軟件,支持Windows 95、98、2000、2003、XP等Windows所有現(xiàn)有的版本,支持pascal腳本,可以快速制作出類似Windows 2000風(fēng)格的安裝界面。該軟件用Delphi語言編寫,可以從其官方網(wǎng)站免費下載源程序。該軟件簡單易懂,主要特點有:支持完全的反安裝功能;可以將不同的版本信息進行識別對比,把正在使用的文件替換掉;小巧、簡便、精美是它的最大特點;其安裝形式靈活多變,甚至超過一些商業(yè)的安裝軟件[4]。
動態(tài)鏈接庫(DLL)是作為獨立的程序模塊存在,封裝特定功能。系統(tǒng)可以單獨測試和編譯它們。在運行可執(zhí)行程序時,一旦系統(tǒng)確定了要調(diào)用的DLL后,就會分配一些內(nèi)存來加載它們。這種方式減少了可執(zhí)行文件的大小和對內(nèi)存空間的需求,并且多個應(yīng)用程序可以同時使用這些DLL模塊。在發(fā)布DLL文件時,會導(dǎo)入一個對應(yīng)的LIB文件。該文件包含了每一個DLL導(dǎo)出函數(shù)的可選的標(biāo)識號和符號名,但是并不含有實際的代碼。LIB文件中也包含了對應(yīng)的DLL文件名(但不是完全的路徑名),鏈接程序?qū)⑵浯鎯υ诳蓤?zhí)行文件內(nèi)部。當(dāng)應(yīng)用程序運行過程中需要加載DLL文件時,系統(tǒng)會根據(jù)上述信息定位、加載DLL,然后通過符號名或標(biāo)識號實現(xiàn)對DLL函數(shù)的動態(tài)鏈接[5]。在相關(guān)DLL缺失的情況下,程序無法正常運行。
在windows系統(tǒng)中,搜索DLL的順序是由注冊表鍵值(HKLMSystemCurrentControlSetSessionManager SafeDllSearchMode)決定的:在vista,xp sp2,server2003中,這個鍵值是1,搜素DLL的順序是:可執(zhí)行文件所在目錄、系統(tǒng)目錄、位系統(tǒng)目錄、windows目錄、當(dāng)前進程目錄、環(huán)境變量PATH中的目錄。這個值為1,在2000 sp4,xp中,這個鍵值是0,搜素DLL的順序是:可執(zhí)行文件所在目錄、 當(dāng)前進程目錄、系統(tǒng)目錄、16位系統(tǒng)目錄、windows目錄、環(huán)境變量PATH中的目錄。
3.1 動態(tài)鏈接庫自動查找方法
如果一個軟件實現(xiàn)的功能很復(fù)雜,那么在Visual Studio平臺上開發(fā)軟件時,就會用到第三方軟件進行輔助[6],所以應(yīng)用軟件所需的文件數(shù)量很多,可以將這些文件分為:軟件正常運行所需的媒體文件、Visual Studio所需文件、依賴的第三方庫文件(這些第三方庫一般以動態(tài)鏈接庫的形式存在)。而航天可視化操控軟件是在Visual Studio平臺上開發(fā)的一款功能強大的應(yīng)用軟件,并且用到了第三方軟件OSG、Qt,在部署中就容易遺漏。為保證所有文件都包括在部署安裝過程之中,使用Visual Studio工具組件中的命令行工具dumpbin來查看可執(zhí)行程序的依賴關(guān)系。perl的優(yōu)勢在于它具備非常強大的處理批量數(shù)據(jù)和文本數(shù)據(jù)的功能[7],于是采用perl語言編寫可以自動查找程序依賴文件并將其打包的程序。部分代碼如下:
exec("dumpbin /dependents ChangE.exe /out: a.txt");
#逐行讀取a.txt文件中的內(nèi)容,并輸出可執(zhí)行程序依賴的文件
sub readf
{
open FILE, "d:/a.txt "; #打開a.txt文件
foreach (
if(/dll$/) print $_," ";} #輸出動態(tài)鏈接庫文件
close(FILE); #關(guān)閉文件
}
#從計算機上查找所依賴的文件
sub wanted
{
my $n;
my @filenames; #數(shù)組存放動態(tài)鏈接庫文件名
foreach $n (@filenames){
if ($_ eq $n){
print $File::Find::name ; #輸出文件的絕對路徑
print " " ;}
}
}
find (&wanted ,"d:/");
#把文件復(fù)制到指定文件夾
sub copyf
{
my $file;
my @files; #數(shù)組存放文件的絕對路徑
foreach $file (@files){
my $path='C:/Documents and Settings/Administrator/'; #目標(biāo)路徑
copy($file,$path);}#將文件復(fù)制到目標(biāo)路徑
}
首先在perl腳本中調(diào)用工具dumpbin對可執(zhí)行程序進行分析,并將結(jié)果輸出到一個臨時文件中,之后解析這個臨時文件得到主程序所依賴的動態(tài)鏈接庫。然后綜合系統(tǒng)默認(rèn)的動態(tài)鏈接庫加載路徑與用戶指定的路徑準(zhǔn)確定位DLL文件,最后把這些文件復(fù)制到指定文件夾。至此,制作安裝包所依賴的各種文件準(zhǔn)備完畢。
3.2 軟件發(fā)布流程
首先,使用dumpbin工具查看可執(zhí)行程序的依賴關(guān)系,再利用perl編寫的程序自動查找軟件依賴的文件并將其打包。把軟件運行所需要的所有文件按照目錄結(jié)構(gòu)放到一起,包括圖片文件、數(shù)據(jù)庫文件、插件等[8]。
其次,運行Inno Setup向?qū)В_始制作軟件包。使用向?qū)гO(shè)置安裝程序的基本信息,包括軟件名稱、版本、軟件許可聲明、缺省安裝路徑、安裝過程提示信息等,在部件中添加所包含的文件組和目錄[9]。把所有需要發(fā)布的程序文件、配置文件、動態(tài)庫文件、資源文件、數(shù)據(jù)庫文件等添加到向?qū)е小?/p>
按照提示完成向?qū)Ш螅砂惭b腳本,可在腳本文件中自行添加代碼,實現(xiàn)多樣化的安裝。保存并編譯腳本,生成安裝包,進行軟件發(fā)布。軟件發(fā)布流程見圖1所示。
圖1 軟件發(fā)布流程圖
3.3 軟件發(fā)布方案測試
測試環(huán)境分別為:(1)Microsoft Windows XP Professional 2002系統(tǒng),AMD Athlon 64 X2 Dual處理器。(2)Microsoft Windows 7系統(tǒng),AMD Athlon 64 X2 Dual處理器。
生成的軟件安裝目錄如圖2所示,sys_data存放主程序所依賴的各種數(shù)據(jù)文件,包括各種配置文件、數(shù)據(jù)庫文件、圖像文件以及模型文件。DLL文件夾中存放查找到的主程序所依賴的各種動態(tài)鏈接庫文件,項目開發(fā)時主程序所依賴的第三方庫主要是Qt,OSG,下圖表明該方案正確查找到了主程序所依賴的各種動態(tài)鏈接庫文件。軟件的安裝界面如圖3所示。
圖2 軟件安裝目錄 圖3 安裝軟件歡迎頁
測試結(jié)果表明,安裝包在測試環(huán)境中運行穩(wěn)定,即使存在多目錄同名DLL文件,該方案也能準(zhǔn)確定位到主程序所依賴的動態(tài)鏈接庫文件,達到預(yù)期效果。
基于開源軟件Inno Setup與perl腳本提出了一種自動化的軟件發(fā)布方案。利用perl腳本強大的文本處理能力與系統(tǒng)粘合力,實現(xiàn)了自動查找程序所依賴的動態(tài)鏈接庫文件的功能,便于可視化操控軟件一站式快速部署、管理和發(fā)布。實踐表明,該方案有效的提高了航天可視化操控軟件的部署效率,降低了系統(tǒng)維護成本,為軟件發(fā)布提供了一種快速有效的途徑。
[1]石柱,袁心成,馬衛(wèi)華,等.適用于航天軟件開發(fā)的可靠性度量[J].航天控制,2004,22(3):87-92.
[2]趙雨水,左春,楊立,等.軟件發(fā)布機制體系結(jié)構(gòu)研究[J].計算機工程與設(shè)計,2010,31(4):700-705.
[3]肖宏偉.專家門診Visual C++開發(fā)答疑[M] .北京:人民郵電出版社,2003.
[4]鄭江花,秦立剛,張霞.基于Inno Setup的Delphi應(yīng)用程序的發(fā)布技巧[J].信息技術(shù)與信息化,2008(3): 76-77.
[5]李娟,張欽.基于動態(tài)鏈接庫的Visual C++混合編程[J].計算機工程與設(shè)計,2010,31(9):2140-2143.
[6]Zhao Zhengxu,Jun Feng,Zhang Zhihua.Complexity Analysis on Engineering Software Data Format Conversion Networks[J]. Complex Systems and Complexity Science,2010,7(1):75-81.
[7]袁潔.基于perl的軟件多語言支持[D].石家莊:石家莊鐵道大學(xué),2012.
[8]Guo Yang,Zhao Zhengxu,Zhou Yiqi.Complexity Analysis with Function-call Graph on Windows Software[J].International Review on Computers and Software,2012,3(7):1149-1153.
[9]趙正旭,龍瑞,郭陽,等.工程軟件的小世界效應(yīng)探究[J].石家莊鐵道大學(xué)學(xué)報:自然科學(xué)版,2010,23(3):1-6.
(責(zé)任編輯 車軒玉)
Software Release Scheme Based on AutomaticSearching for Dynamic Linkable Library
Zhao Zhengxu, Liu Tian, Zhang Denghui
(School of Information Science and Technology, Shijiazhuang Tiedao University, Shijiazhuang 050043,China)
For the issue of manually locating the dynamic linkable library which the main program depends on during the traditional software release, we propose a software release scheme based on searching automatically for the dynamic linkable library. This scheme searches automatically for the dynamic linkable library which the program depends on through the perl script, solves the problem of the same dynamic linkable library not properly located in the multi-path, and achieves the release of large software system using the open source tool Inno Setup. This scheme avoids the trouble brought by finding manually dependent libraries, reduces the manual intervention, reduces the cost of system maintenance, provides a quick and effective way for releasing software and improves the efficiency as well as stability of the software release.
software release;software life cycle;perl script
10.13319/j.cnki.sjztddxxbzrb.2014.03.14
2013-06-07
趙正旭 男 1960年出生 教授
國家自然科學(xué)基金(60873208)
TP311
A
2095-0373(2014)03-0064-05