主頁 > 軟體工程 > 【原創&交流】windows下撰寫綠色軟體的設想

【原創&交流】windows下撰寫綠色軟體的設想

2020-09-12 01:21:03 軟體工程

鏈接: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熱心網友回復:

參考 1 樓 zgl7903 的回復:
靜態鏈接VC庫的APP,依然是綠色的


靜態鏈接VC庫,會大大增加PE檔案的大小,影響運行效率。

uj5u.com熱心網友回復:

VSCode了解一下

uj5u.com熱心網友回復:

參考 3 樓 走好每一步 的回復:
VSCode了解一下


VSCode是基于谷歌瀏覽器框架的。

uj5u.com熱心網友回復:

參考
靜態鏈接VC庫,會大大增加PE檔案的大小,影響運行效率。

影響多大,影響是如何產生的?能不能科普下?

uj5u.com熱心網友回復:

參考 5 樓 draculamx 的回復:
參考
靜態鏈接VC庫,會大大增加PE檔案的大小,影響運行效率。

影響多大,影響是如何產生的?能不能科普下?


      靜態鏈接,歸根結底是把依賴庫的obj檔案都包含進來,結果就增加了PE檔案的大小。比如動態鏈接的exe檔案是1M,靜態鏈接的exe就有可能是5M。怎么影響效率,啟動一個exe行程,實質就是打開一個exe檔案,打開一個1M的exe檔案和打開一個5M的exe檔案,后者耗費的記憶體是前者的5倍吧。當然上面只是舉例,不代表所有的靜態鏈接的exe檔案的大小是動態鏈接的5倍。不過按照正常,靜態鏈接的exe檔案至少比動態鏈接的exe檔案大兩三倍。

uj5u.com熱心網友回復:

沒事,動態鏈接把dll帶全了也是綠色軟體。主要的區別在于是不是依賴com,依賴注冊rpc,或者大量預制注冊表。

uj5u.com熱心網友回復:

參考 7 樓 丁勁犇 的回復:
沒事,動態鏈接把dll帶全了也是綠色軟體。主要的區別在于是不是依賴com,依賴注冊rpc,或者大量預制注冊表。


那你得一塊帶全多少個dll啊!

uj5u.com熱心網友回復:

稍微大型一點的軟體,都會帶十幾個或幾十個dll檔案,不僅如此,還有各種資源檔案。不信你打開QQ檔案夾看看。
軟體開發還經常用到第三方庫,開源的還可以辛苦點把源代碼扣出來,不開源的呢?
我以為,不是光禿禿一個主程式就是綠色軟體,應該是不依賴于系統環境可以正常作業的軟體。簡單點說,就是安裝完的程式檔案夾拷貝到別的電腦可以直接運行的。

uj5u.com熱心網友回復:

windows有附帶VC6/MFC4.2的運行時 后續版本才需要單獨安裝運行時

uj5u.com熱心網友回復:

參考 9 樓 mmcanyu 的回復:
稍微大型一點的軟體,都會帶十幾個或幾十個dll文件,不僅如此,還有各種資源檔案。不信你打開QQ檔案夾看看。
軟體開發還經常用到第三方庫,開源的還可以辛苦點把源代碼扣出來,不開源的呢?
我以為,不是光禿禿一個主程式就是綠色軟體,應該是不依賴于系統環境可以正常作業的軟體。簡單點說,就是安裝完的程式檔案夾拷貝到別的電腦可以直接運行的。


     對啊,我的意思就是這樣。

uj5u.com熱心網友回復:

uj5u.com熱心網友回復:

參考 10 樓 陳仲甫 的回復:
windows有附帶VC6/MFC4.2的運行時 后續版本才需要單獨安裝運行時


vc的運行時庫本來就不是必要的。

uj5u.com熱心網友回復:

參考 6 樓 clever101 的回復:
Quote: 參考 5 樓 draculamx 的回復:
參考
靜態鏈接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

標籤:基礎類

上一篇:opencv或深度學習 識別定位圖片中的十字符號

下一篇:加載第三方dll出現 Load library fail錯誤!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more