【原创&交流】windows下编写绿色软件的设想

clever101
博客专家认证
2020-08-08 09:02:12
链接: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。
...全文
418 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
clever101 2020-08-14
  • 打赏
  • 举报
回复
引用 10 楼 陈仲甫 的回复:
windows有附带VC6/MFC4.2的运行时 后续版本才需要单独安装运行时
vc的运行时库本来就不是必要的。
Eleven 2020-08-14
  • 打赏
  • 举报
回复
draculamx 2020-08-14
  • 打赏
  • 举报
回复
引用 6 楼 clever101 的回复:
[quote=引用 5 楼 draculamx 的回复:]
引用
静态链接VC库,会大大增加PE文件的大小,影响运行效率。
影响多大,影响是如何产生的?能不能科普下?
静态链接,归根结底是把依赖库的obj文件都包含进来,结果就增加了PE文件的大小。比如动态链接的exe文件是1M,静态链接的exe就有可能是5M。怎么影响效率,启动一个exe进程,实质就是打开一个exe文件,打开一个1M的exe文件和打开一个5M的exe文件,后者耗费的内存是前者的5倍吧。当然上面只是举例,不代表所有的静态链接的exe文件的大小是动态链接的5倍。不过按照正常,静态链接的exe文件至少比动态链接的exe文件大两三倍。[/quote] 这只说明了exe文件在启动时候的效率,如果一个exe运行的大部分时间是在不停的“启动”和“关闭”,那确实影响非常大。但这是不可能出现的应用场景。实际上exe被加载以后,运行时候的效率,和exe文件本身的体积并没有太大关系,或者说几乎没有关系。。 实际上在现如今的PC上,追求exe二进制文件的大小几乎是没有什么意义的。目前唯一对exe二进制文件大小比较敏感的场合,是在嵌入式开发中
clever101 2020-08-13
  • 打赏
  • 举报
回复
引用 5 楼 draculamx 的回复:
引用
静态链接VC库,会大大增加PE文件的大小,影响运行效率。
影响多大,影响是如何产生的?能不能科普下?
静态链接,归根结底是把依赖库的obj文件都包含进来,结果就增加了PE文件的大小。比如动态链接的exe文件是1M,静态链接的exe就有可能是5M。怎么影响效率,启动一个exe进程,实质就是打开一个exe文件,打开一个1M的exe文件和打开一个5M的exe文件,后者耗费的内存是前者的5倍吧。当然上面只是举例,不代表所有的静态链接的exe文件的大小是动态链接的5倍。不过按照正常,静态链接的exe文件至少比动态链接的exe文件大两三倍。
draculamx 2020-08-13
  • 打赏
  • 举报
回复
引用
静态链接VC库,会大大增加PE文件的大小,影响运行效率。
影响多大,影响是如何产生的?能不能科普下?
clever101 2020-08-13
  • 打赏
  • 举报
回复
引用 9 楼 mmcanyu 的回复:
稍微大型一点的软件,都会带十几个或几十个dll文件,不仅如此,还有各种资源文件。不信你打开QQ文件夹看看。 软件开发还经常用到第三方库,开源的还可以辛苦点把源代码扣出来,不开源的呢? 我以为,不是光秃秃一个主程序就是绿色软件,应该是不依赖于系统环境可以正常工作的软件。简单点说,就是安装完的程序文件夹拷贝到别的电脑可以直接运行的。
对啊,我的意思就是这样。
an_bachelor 2020-08-13
  • 打赏
  • 举报
回复
windows有附带VC6/MFC4.2的运行时 后续版本才需要单独安装运行时
mmcanyu 2020-08-13
  • 打赏
  • 举报
回复
稍微大型一点的软件,都会带十几个或几十个dll文件,不仅如此,还有各种资源文件。不信你打开QQ文件夹看看。 软件开发还经常用到第三方库,开源的还可以辛苦点把源代码扣出来,不开源的呢? 我以为,不是光秃秃一个主程序就是绿色软件,应该是不依赖于系统环境可以正常工作的软件。简单点说,就是安装完的程序文件夹拷贝到别的电脑可以直接运行的。
clever101 2020-08-13
  • 打赏
  • 举报
回复
引用 7 楼 丁劲犇 的回复:
没事,动态链接把dll带全了也是绿色软件。主要的区别在于是不是依赖com,依赖注册rpc,或者大量预制注册表。
那你得一块带全多少个dll啊!
  • 打赏
  • 举报
回复
没事,动态链接把dll带全了也是绿色软件。主要的区别在于是不是依赖com,依赖注册rpc,或者大量预制注册表。
clever101 2020-08-11
  • 打赏
  • 举报
回复
引用 3 楼 走好每一步 的回复:
VSCode了解一下
VSCode是基于谷歌浏览器框架的。
走好每一步 2020-08-11
  • 打赏
  • 举报
回复
VSCode了解一下
clever101 2020-08-09
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
静态链接VC库的APP,依然是绿色的
静态链接VC库,会大大增加PE文件的大小,影响运行效率。
zgl7903 2020-08-09
  • 打赏
  • 举报
回复
静态链接VC库的APP,依然是绿色的

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧