windows下编写绿色软件的设想

作者:朱金灿
来源:clever101的专栏

一.什么是绿色软件

  我设想过一些简单实用的工具,比如解压缩工具、图像浏览器之类本身就不应该通过安装包来安装。就是说一些简单的工具应该把运行文件下载下来就能用的,而不应该通过安装包来安装。在这里最典型的例子就是微软出品的depends软件,它就只有一个depends.exe,无论你把这个depends.exe拷贝到windows xp、windows 7还是windows 10上(无论是32位系统还是64位系统),它都能直接运行。它是怎么做到的,我试着研究了一番。我用depends打开depends.exe,看看它的依赖库是什么,如下图:
windows下编写绿色软件的设想_第1张图片

可以看出它依赖的都是windows系统库。我们再看看一些需要安装包的软件如Adobe Audition 3.0的库依赖情况,如下图:
windows下编写绿色软件的设想_第2张图片

可以看到除了依赖windows系统库,还依赖于vc的运行时库。我们知道vc的运行时库是分不同版本的,如上图的Audition 3.0依赖的就是VC 2003的运行时库。

  比较二者我们可以得出一个结论:是否依赖于vc运行时库是绿色软件和非绿色软件的一大区别。

二.如何开发绿色软件

  那么问题来了:如何开发绿色软件。这个问题其实应该是如何在编译软件时去除软件对vc运行时库的依赖。我曾经试验过使用VS编译VC工程是无法去除VC运行时库的依赖的。我摸索了一种办法,就是使用makefile编译C/C++代码是可以去除对vc运行时库的依赖。下面是一段示例makefile脚本:


#Microsoft SDKs因个人安装的VS路径的不同而不同
!include 
#设置编译标记,初始化为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  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。

你可能感兴趣的:(Visual,C++)