我用VC2008编写了一个小win32程序,编译Release版是55K,使用depends查看,发现需要用到user32.dll,kernel32.dll,shell32.dll,MSVCR90.dll;然后我静态编译成87K,使用depends查看,程序用到user32.dll,kernel32.dll,shell32.dll。
请问这样一个程序在没有VC运行库的机子上能否运行??

解决方案 »

  1.   

    VC运行库没必要,但所需的DLL是必须的。因为那是你接口功能函数存在滴地方。
    当然,user32.dll,kernel32.dll,shell32.dll这三个WIN平台都有的。其他的就很难说了
      

  2.   

    Win32 SDK程序不用带运行库的,肯定可以用。
      

  3.   


    这些DLL里,MSVCR90.DLL是VC的运行时库,就是说9.0版的运行时库,这个不一定对方系统有的,其他都是系统自带的,静态编译也不能保证就能在对方机器上运行。简单说下为什么:1.首先是动态编译,VC的编译器会编译你的源码,但是比如你使用了MFC等,他会动态调用 mfc90.dll 这个根据你MFC版本而定。如果是 win32程序,就不会有mfcXX.dll 但是如果你用了C的运行时库,会有 msvcrtXX.dll 这些库,一般如XP自带了6.0的 msvcrt.dll 但是9.0应该是2008的,这个就要看对方是否以前安装过2008的运行时库了。2.静态编译,静态编译以后不会又 mfcXX.dll 他会静态编译到应用程序里,但是应用程序会变得很大。一般都在几百K左右(MFC程序)。3.静态编译+多线程(/MT)参数,这个才是关键。在项目属性-》编译器-》代码生成里,有个运行时库的选项,一般为多线程DLL(/MD),这里改成多线程(/MT)就不会有 msvcrXXX.dll 了,但是体积进一步增大。另外有些优化方法可以减小体积,例如使用 lstrlen lstrcpy 这些被 kernel32.dll 导出的函数。另外VC6有个精简的RTL库,Google一下你就知道。