为什么我编译出来的程序必须要装了Microsoft Visual C++ 2005 SP1 Redistributable Package 才能运行

时间:2022-09-01 07:59:24
写了个程序,DLL是VC2005开发的,界面是用BCB6开发的,在运行的时候报“应用程序正常初始化(0xc0150002)失败”错误。后来google后说要安装了Microsoft Visual C++ 2005 SP1 Redistributable Package就可以了。装上这个补丁后的确就可以运行了。请问是什么原因?

31 个解决方案

#1


DLL中用到了VS2005中的库,比如MSVCR80.dll等库,那就必须安装vs2008发布包,或者把这个动态库复制过去啊

#2


引用 1 楼 skybblue 的回复:
DLL中用到了VS2005中的库,比如MSVCR80.dll等库,那就必须安装vs2008发布包,或者把这个动态库复制过去啊

是这个原因

#3


这样也行吧:在工程的属性中,把共享dll换成使用静态库那个  然后再重新build下 

#4


把你开发机上的C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\对应工程的动态库文件随EXE一起发布,可以不需要你所说的安装包!

#5


引用 1 楼 skybblue 的回复:
DLL中用到了VS2005中的库,比如MSVCR80.dll等库,那就必须安装vs2008发布包,或者把这个动态库复制过去啊


up
楼主缺少了一些依赖类库了

#6


VC2005的要求。

#7


有没有办法在编译时通过参数设置从而使编译出来的dll在运行时不依赖于VC的库。

#8


#3的方法,链接静态库。

#9


如果是静态库,那就没有DLL文件了。静态引用的话界面的exe会非常大的。

#10


引用 9 楼 nepalon 的回复:
如果是静态库,那就没有DLL文件了。静态引用的话界面的exe会非常大的。

静态方法就是会大,因为用到的DLL等已经link进你的exe了,不然就需要带上你用到的dll,就这么两种办法

#11


引用 3 楼 daviemeng 的回复:
这样也行吧:在工程的属性中,把共享dll换成使用静态库那个  然后再重新build下


就这样吧.

#12


把几个DLL一起发布了吧,要是目标机子上没有,还是要装的

#13


我试了把MSVCR80.dll考到我的程序目录下,还是不行

#14


引用 13 楼 nepalon 的回复:
我试了把MSVCR80.dll考到我的程序目录下,还是不行


需要你开发机上的X86的对应工程下的几个动态库文件!

引用 7 楼 nepalon 的回复:
有没有办法在编译时通过参数设置从而使编译出来的dll在运行时不依赖于VC的库。


可以用release方式!

#15


引用 14 楼 leitianjun 的回复:
可以用release方式!


我现在就是用release方式来编译的,所以自认为是不需要VC的库就可以直接运行的了,没想到还会出现这个问题。不知是不是我什么地方设置不正确,望指点一二。

#16


用静态链接
为什么我编译出来的程序必须要装了Microsoft Visual C++ 2005 SP1 Redistributable Package 才能运行

#17


引用 16 楼 tr0j4n 的回复:
用静态链接

静态库的方案不可能使用,如果这样的话我的EXE文件都要有几十兆了。所以必须用动态库。

#18


引用 17 楼 nepalon 的回复:
引用 16 楼 tr0j4n 的回复:
用静态链接


静态库的方案不可能使用,如果这样的话我的EXE文件都要有几十兆了。所以必须用动态库。

动态库方式,就要Release的exe,然后加上对应的mfc80.dll,mfc80p.dll...等各个dll

#19


引用 18 楼 oyljerry 的回复:
动态库方式,就要Release的exe,然后加上对应的mfc80.dll,mfc80p.dll...等各个dll


怎样知道要用哪些dll。我的工程里并没有用到mfc、atl,在工程属性中我设置的是“Use Standard Windows Libraries”和“Not Using ATL”。

#20


引用 19 楼 nepalon 的回复:
引用 18 楼 oyljerry 的回复:
 动态库方式,就要Release的exe,然后加上对应的mfc80.dll,mfc80p.dll...等各个dll


 怎样知道要用哪些dll。我的工程里并没有用到mfc、atl,在工程属性中我设置的是“Use Standard Windows Libraries”和“Not Using ATL”。

那就带上vc runtime 的dll,msvcr80.dll,msvcm80.dll,msvcp80.dll这几个dll

#21


引用 20 楼 oyljerry 的回复:
那就带上vc runtime 的dll,msvcr80.dll,msvcm80.dll,msvcp80.dll这几个dll

这个要怎样设置,能不能说详细一点。是在VC工程属性里设置吗?我试过把这三个dll放到我的运行目录下还是不行。

#22


用Depends看看,你的程序需要哪些DLL的支持。

#23


运行库放在同个目录下也可以的应该

#24


装就装被

#25


引用 22 楼 tr0j4n 的回复:
用Depends看看,你的程序需要哪些DLL的支持。

从Depends上看到需要以下几个库:
c:\windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_e6967989\MSVCP80.DLL
c:\windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_e6967989\MSVCR80.DLL
我已经把这两个库复制到我的程序目录下了,还是无法运行。

#26


我把msvcr80.dll,msvcm80.dll,msvcp80.dll这几个考到C:\WINDOWS\SYSTEM32里还不行。

#27


vc下有DEPENDS。EXE工具可以看PE程序里用的DLL文件

#28


引用 27 楼 churenxh 的回复:
vc下有DEPENDS。EXE工具可以看PE程序里用的DLL文件

我已经通过Depends查到就是需要msvcr80.dll,msvcm80.dll,msvcp80.dll这几个dll文件。现在的问题是要怎样把这几个文件打包到我的程序中?
我试过把几个文件考到我的程序目录下,也试过考到C:\WINDOWS\SYSTEM32下,还是不行。

#29


问题已经解决,只要在编译的时候设置以下工程属性就可以了:
c/c++->code generation->runtime library设置成/MT,linker->manifest file->generate manifest设置成no。
信息是从http://topic.csdn.net/u/20080131/14/06abd302-a469-4a4a-82ea-2fe3bfd2e102.html获取的。

#30


编译的时候带上 /mt 开关,就可以了

#31


...

#1


DLL中用到了VS2005中的库,比如MSVCR80.dll等库,那就必须安装vs2008发布包,或者把这个动态库复制过去啊

#2


引用 1 楼 skybblue 的回复:
DLL中用到了VS2005中的库,比如MSVCR80.dll等库,那就必须安装vs2008发布包,或者把这个动态库复制过去啊

是这个原因

#3


这样也行吧:在工程的属性中,把共享dll换成使用静态库那个  然后再重新build下 

#4


把你开发机上的C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\对应工程的动态库文件随EXE一起发布,可以不需要你所说的安装包!

#5


引用 1 楼 skybblue 的回复:
DLL中用到了VS2005中的库,比如MSVCR80.dll等库,那就必须安装vs2008发布包,或者把这个动态库复制过去啊


up
楼主缺少了一些依赖类库了

#6


VC2005的要求。

#7


有没有办法在编译时通过参数设置从而使编译出来的dll在运行时不依赖于VC的库。

#8


#3的方法,链接静态库。

#9


如果是静态库,那就没有DLL文件了。静态引用的话界面的exe会非常大的。

#10


引用 9 楼 nepalon 的回复:
如果是静态库,那就没有DLL文件了。静态引用的话界面的exe会非常大的。

静态方法就是会大,因为用到的DLL等已经link进你的exe了,不然就需要带上你用到的dll,就这么两种办法

#11


引用 3 楼 daviemeng 的回复:
这样也行吧:在工程的属性中,把共享dll换成使用静态库那个  然后再重新build下


就这样吧.

#12


把几个DLL一起发布了吧,要是目标机子上没有,还是要装的

#13


我试了把MSVCR80.dll考到我的程序目录下,还是不行

#14


引用 13 楼 nepalon 的回复:
我试了把MSVCR80.dll考到我的程序目录下,还是不行


需要你开发机上的X86的对应工程下的几个动态库文件!

引用 7 楼 nepalon 的回复:
有没有办法在编译时通过参数设置从而使编译出来的dll在运行时不依赖于VC的库。


可以用release方式!

#15


引用 14 楼 leitianjun 的回复:
可以用release方式!


我现在就是用release方式来编译的,所以自认为是不需要VC的库就可以直接运行的了,没想到还会出现这个问题。不知是不是我什么地方设置不正确,望指点一二。

#16


用静态链接
为什么我编译出来的程序必须要装了Microsoft Visual C++ 2005 SP1 Redistributable Package 才能运行

#17


引用 16 楼 tr0j4n 的回复:
用静态链接

静态库的方案不可能使用,如果这样的话我的EXE文件都要有几十兆了。所以必须用动态库。

#18


引用 17 楼 nepalon 的回复:
引用 16 楼 tr0j4n 的回复:
用静态链接


静态库的方案不可能使用,如果这样的话我的EXE文件都要有几十兆了。所以必须用动态库。

动态库方式,就要Release的exe,然后加上对应的mfc80.dll,mfc80p.dll...等各个dll

#19


引用 18 楼 oyljerry 的回复:
动态库方式,就要Release的exe,然后加上对应的mfc80.dll,mfc80p.dll...等各个dll


怎样知道要用哪些dll。我的工程里并没有用到mfc、atl,在工程属性中我设置的是“Use Standard Windows Libraries”和“Not Using ATL”。

#20


引用 19 楼 nepalon 的回复:
引用 18 楼 oyljerry 的回复:
 动态库方式,就要Release的exe,然后加上对应的mfc80.dll,mfc80p.dll...等各个dll


 怎样知道要用哪些dll。我的工程里并没有用到mfc、atl,在工程属性中我设置的是“Use Standard Windows Libraries”和“Not Using ATL”。

那就带上vc runtime 的dll,msvcr80.dll,msvcm80.dll,msvcp80.dll这几个dll

#21


引用 20 楼 oyljerry 的回复:
那就带上vc runtime 的dll,msvcr80.dll,msvcm80.dll,msvcp80.dll这几个dll

这个要怎样设置,能不能说详细一点。是在VC工程属性里设置吗?我试过把这三个dll放到我的运行目录下还是不行。

#22


用Depends看看,你的程序需要哪些DLL的支持。

#23


运行库放在同个目录下也可以的应该

#24


装就装被

#25


引用 22 楼 tr0j4n 的回复:
用Depends看看,你的程序需要哪些DLL的支持。

从Depends上看到需要以下几个库:
c:\windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_e6967989\MSVCP80.DLL
c:\windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_e6967989\MSVCR80.DLL
我已经把这两个库复制到我的程序目录下了,还是无法运行。

#26


我把msvcr80.dll,msvcm80.dll,msvcp80.dll这几个考到C:\WINDOWS\SYSTEM32里还不行。

#27


vc下有DEPENDS。EXE工具可以看PE程序里用的DLL文件

#28


引用 27 楼 churenxh 的回复:
vc下有DEPENDS。EXE工具可以看PE程序里用的DLL文件

我已经通过Depends查到就是需要msvcr80.dll,msvcm80.dll,msvcp80.dll这几个dll文件。现在的问题是要怎样把这几个文件打包到我的程序中?
我试过把几个文件考到我的程序目录下,也试过考到C:\WINDOWS\SYSTEM32下,还是不行。

#29


问题已经解决,只要在编译的时候设置以下工程属性就可以了:
c/c++->code generation->runtime library设置成/MT,linker->manifest file->generate manifest设置成no。
信息是从http://topic.csdn.net/u/20080131/14/06abd302-a469-4a4a-82ea-2fe3bfd2e102.html获取的。

#30


编译的时候带上 /mt 开关,就可以了

#31


...