鏈接:windows下撰寫綠色軟體的設想
一.什么是綠色軟體
??我設想過一些簡單實用的工具,比如解壓縮工具、影像瀏覽器之類本身就不應該通過安裝包來安裝。就是說一些簡單的工具應該把運行檔案下載下來就能用的,而不應該通過安裝包來安裝。在這里最典型的例子就是微軟出品的depends軟體,它就只有一個depends.exe,無論你把這個depends.exe拷貝到windows xp、windows 7還是windows 10上(無論是32位系統還是64位系統),它都能直接運行。它是怎么做到的,我試著研究了一番。我用depends打開depends.exe,看看它的依賴庫是什么,如下圖:

可以看出它依賴的都是windows系統庫。我們再看看一些需要安裝包的軟體如Adobe Audition 3.0的庫依賴情況,如下圖:

可以看到除了依賴windows系統庫,還依賴于vc的運行時庫。我們知道vc的運行時庫是分不同版本的,如上圖的Audition 3.0依賴的就是VC 2003的運行時庫。
??比較二者我們可以得出一個結論:是否依賴于vc運行時庫是綠色軟體和非綠色軟體的一大區別。
二.如何開發綠色軟體
??那么問題來了:如何開發綠色軟體。這個問題其實應該是如何在編譯軟體時去除軟體對vc運行時庫的依賴。我曾經試驗過使用VS編譯VC工程是無法去除VC運行時庫的依賴的。我摸索了一種辦法,就是使用makefile編譯C/C++代碼是可以去除對vc運行時庫的依賴。下面是一段示例makefile腳本:
#Microsoft SDKs因個人安裝的VS路徑的不同而不同
!include <C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\Win32.Mak>
#設定編譯標記,初始化為FALSE
CFGSET = FALSE
RUN_CLEAN = FALSE
!IF "$(option)"== "1"
CFGSET = TRUE
Configuration = Release
Platform = x64
#定義release版本的前處理器
CC_OPTION = -D_WIN64 -D_NDEBUG -D_WINDOWS
TARGET_MACHINE = X64
!ELSE IF "$(option)"== "2"
CFGSET = TRUE
Configuration = Debug
Platform = x64
#定義debug版本的編譯選項
CC_OPTION = -D_WIN64 -D_DEBUG -D_WINDOWS /MDd
TARGET_MACHINE = X64
!ELSE IF "$(option)"== "3"
CFGSET = TRUE
Configuration = Release
Platform = Win32
CC_OPTION = -D_WIN32 -D_NDEBUG -D_WINDOWS
TARGET_MACHINE = X86
!ELSE IF "$(option)"== "4"
CFGSET = TRUE
Configuration = Debug
Platform = Win32
CC_OPTION = -D_WIN32 -D_DEBUG -D_WINDOWS /MDd
TARGET_MACHINE = X86
!ELSE IF "$(option)"=="5"
CFGSET=TRUE
RUN_CLEAN=TRUE
!ENDIF
CC = $(CC_OPTION)
# 提示用法
!IF "$(CFGSET)"== "FALSE"
!MESSAGE Usage: nmake /f makefile.vc option=1 or 2 or 3 or 4 or 5
!MESSAGE
!MESSAGE where <config> is one of:
!MESSAGE - option=1 - build x64 release version
!MESSAGE - option=2 - build x64 debug version
!MESSAGE - option=3 - build x86 release version
!MESSAGE - option=4 - build x86 debug version
!MESSAGE - option=5 - clear output file
!MESSAGE
!MESSAGE
!ERROR please choose a valid configuration instead"
!ENDIF
#假如運行清理命令
!IF "$(RUN_CLEAN)" == "TRUE"
CLEAN:
if exist "..\..\Intdir\Debug_x64\FileSplitAndMerge" (del "..\..\Intdir\Debug_x64\FileSplitAndMerge\*.obj") else echo Debug_x64 not exist
if exist "..\..\Intdir\Debug_Win32\FileSplitAndMerge" (del "..\..\Intdir\Debug_Win32\FileSplitAndMerge\*.obj") else echo Debug_Win32 not exist
if exist "..\..\Intdir\Release_x64\FileSplitAndMerge" (del "..\..\Intdir\Release_x64\FileSplitAndMerge\*.obj") else echo Release_x64 not exist
if exist "..\..\Intdir\Release_Win32\FileSplitAndMerge" (del "..\..\Intdir\Release_Win32\FileSplitAndMerge\*.obj") else echo Release_Win32 not exist
!ELSE
#設定輸出檔案夾和臨時目錄檔案夾
OUTDIR =..\..\OutDir\$(Configuration)_$(Platform)
INDIR =..\..\Intdir\$(Configuration)_$(Platform)\FileSplitAndMerge
#設定所有輸出
all: $(INDIR) $(OUTDIR) $(OUTDIR)\FileSplitAndMerge.exe
#假如不存在$(INDIR)檔案夾,就創建它
$(INDIR) :
if not exist "$(INDIR)" mkdir $(INDIR)
#假如不存在$(OUTDIR)檔案夾,就創建它
$(OUTDIR) :
if not exist "$(OUTDIR)" mkdir $(OUTDIR)
#編譯資源腳本
$(INDIR)\Resource.res:.\Resource.rc
rc.exe /n /v /fo $(INDIR)\Resource.res .\Resource.rc
#編譯原始碼
$(INDIR)\splitFile.obj:.\splitFile.c
cl -c $(CC) /Fo"$(INDIR)\\" /Fd"$(INDIR)\\" .\splitFile.c
$(INDIR)\mergeFile.obj:.\mergeFile.c
cl -c $(CC) /Fo"$(INDIR)\\" /Fd"$(INDIR)\\" .\mergeFile.c
$(INDIR)\Progress.obj:.\Progress.c
cl -c $(CC) /Fo"$(INDIR)\\" /Fd"$(INDIR)\\" .\Progress.c
$(INDIR)\mainDlg.obj:.\mainDlg.c $(INDIR)\splitFile.obj $(INDIR)\mergeFile.obj $(INDIR)\Resource.res $(INDIR)\Progress.obj
cl -c $(CC) /Fo"$(INDIR)\\" /Fd"$(INDIR)\\" .\mainDlg.c
#鏈接
$(OUTDIR)\FileSplitAndMerge.exe: $(INDIR)\mainDlg.obj
link /machine:$(TARGET_MACHINE) /INCREMENTAL:YES /NOLOGO /subsystem:windows /out:$(OUTDIR)\FileSplitAndMerge.exe $(INDIR)\splitFile.obj $(INDIR)\mergeFile.obj $(INDIR)\Progress.obj $(INDIR)\mainDlg.obj $(INDIR)\Resource.res kernel32.lib user32.lib gdi32.lib comdlg32.lib Shell32.lib
!ENDIF
三.構建綠色版VS的設想
??如果我們再將思路擴展一下,我們可以組裝一個綠色版的VS。一個精簡版的VS實際上是由windows SDK、代碼編輯器、資源腳本編輯器、編譯器、聯結器和除錯器組成的。windows SDK實際上是一堆頭檔案和庫檔案,可以單獨抽取出來,代碼編輯器可以用文本編輯器,資源腳本編輯器可以用ResEd (Resource Editor)代替,編譯器、聯結器可以從安裝版的VS中抽取出來,除錯器可以用windbg代替VS的除錯器。上面提到的各種替代品都是綠色軟體。文本編輯器用來撰寫代碼,使用makefile編譯代碼,使用windbg除錯代碼,這樣就不用安裝龐大的VisualStudio,每次撰寫代碼時也不用啟動龐大的VisualStudio。
uj5u.com熱心網友回復:
靜態鏈接VC庫的APP,依然是綠色的uj5u.com熱心網友回復:
靜態鏈接VC庫,會大大增加PE檔案的大小,影響運行效率。
uj5u.com熱心網友回復:
VSCode了解一下uj5u.com熱心網友回復:
VSCode是基于谷歌瀏覽器框架的。
uj5u.com熱心網友回復:
影響多大,影響是如何產生的?能不能科普下?
uj5u.com熱心網友回復:
靜態鏈接,歸根結底是把依賴庫的obj檔案都包含進來,結果就增加了PE檔案的大小。比如動態鏈接的exe檔案是1M,靜態鏈接的exe就有可能是5M。怎么影響效率,啟動一個exe行程,實質就是打開一個exe檔案,打開一個1M的exe檔案和打開一個5M的exe檔案,后者耗費的記憶體是前者的5倍吧。當然上面只是舉例,不代表所有的靜態鏈接的exe檔案的大小是動態鏈接的5倍。不過按照正常,靜態鏈接的exe檔案至少比動態鏈接的exe檔案大兩三倍。
uj5u.com熱心網友回復:
沒事,動態鏈接把dll帶全了也是綠色軟體。主要的區別在于是不是依賴com,依賴注冊rpc,或者大量預制注冊表。uj5u.com熱心網友回復:
沒事,動態鏈接把dll帶全了也是綠色軟體。主要的區別在于是不是依賴com,依賴注冊rpc,或者大量預制注冊表。
那你得一塊帶全多少個dll啊!
uj5u.com熱心網友回復:
稍微大型一點的軟體,都會帶十幾個或幾十個dll檔案,不僅如此,還有各種資源檔案。不信你打開QQ檔案夾看看。軟體開發還經常用到第三方庫,開源的還可以辛苦點把源代碼扣出來,不開源的呢?
我以為,不是光禿禿一個主程式就是綠色軟體,應該是不依賴于系統環境可以正常作業的軟體。簡單點說,就是安裝完的程式檔案夾拷貝到別的電腦可以直接運行的。
uj5u.com熱心網友回復:
windows有附帶VC6/MFC4.2的運行時 后續版本才需要單獨安裝運行時uj5u.com熱心網友回復:
稍微大型一點的軟體,都會帶十幾個或幾十個dll文件,不僅如此,還有各種資源檔案。不信你打開QQ檔案夾看看。
軟體開發還經常用到第三方庫,開源的還可以辛苦點把源代碼扣出來,不開源的呢?
我以為,不是光禿禿一個主程式就是綠色軟體,應該是不依賴于系統環境可以正常作業的軟體。簡單點說,就是安裝完的程式檔案夾拷貝到別的電腦可以直接運行的。
對啊,我的意思就是這樣。
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
windows有附帶VC6/MFC4.2的運行時 后續版本才需要單獨安裝運行時
vc的運行時庫本來就不是必要的。
uj5u.com熱心網友回復:
靜態鏈接VC庫,會大大增加PE檔案的大小,影響運行效率。
影響多大,影響是如何產生的?能不能科普下?
靜態鏈接,歸根結底是把依賴庫的obj檔案都包含進來,結果就增加了PE檔案的大小。比如動態鏈接的exe檔案是1M,靜態鏈接的exe就有可能是5M。怎么影響效率,啟動一個exe行程,實質就是打開一個exe檔案,打開一個1M的exe檔案和打開一個5M的exe檔案,后者耗費的記憶體是前者的5倍吧。當然上面只是舉例,不代表所有的靜態鏈接的exe檔案的大小是動態鏈接的5倍。不過按照正常,靜態鏈接的exe檔案至少比動態鏈接的exe檔案大兩三倍。
這只說明了exe檔案在啟動時候的效率,如果一個exe運行的大部分時間是在不停的“啟動”和“關閉”,那確實影響非常大。但這是不可能出現的應用場景。實際上exe被加載以后,運行時候的效率,和exe檔案本身的體積并沒有太大關系,或者說幾乎沒有關系。。
實際上在現如今的PC上,追求exe二進制檔案的大小幾乎是沒有什么意義的。目前唯一對exe二進制檔案大小比較敏感的場合,是在嵌入式開發中
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/8938.html
標籤:基礎類
