如何让我静态编译的vc2008工程能够在所有的xp都跑起来?--2

yoogle 2009-06-15 10:05:32
http://topic.csdn.net/u/20090615/09/c2bdaee3-6542-4b3f-b100-ddd2040eddc1.html
两百分求解!
开发环境:vc2008,版本9.0 sp1
工程设置:Multi-threaded DLL (/MD);Use Unicode Character Set;Use MFC in a Static Library
使用了cximage,cximage的工程设置与主工程设置相同。cximage和主工程在一个solution中,以依赖工程的形式存在。

问题:编译出来后,按照上面的设置,应该只需要一个执行文件就可以执行,但是在一个干净的xp上却弹出下面得错误
“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。”。我用了下面提到的一个方法可以运行了,但是不是我想要的方式,

我的需求是:
我只是做的一个小程序,为了运行我的小程序,还要目标机安装一个vcredist_x86.exe的程序,我觉得有点不合适,因此我想寻求一种方法,是否只要拷贝几个合适的dll就能让我的程序运行起来?都需要哪些dll?


参考:
1,我在网上查了一些资料,说这个原因还是xp上没有安装合适的库文件,需要根据 myproject.exe.intermediate.manifest中的设置宝贝适当的dll过去,于是我查看了我的这个设置文件,如下:,但是拷贝了相关的这些dll到程序所在目录并不起作用。
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.30729.1' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.MFC' version='9.0.30729.1' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' />
</dependentAssembly>
</dependency>
</assembly>

2,后来我又查到第二个方案,在目标xp上安装vcredist_x86.exe这个安装包,于是安装后程序能运行起来。
...全文
399 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Acolour 2010-02-21
  • 打赏
  • 举报
回复
我用的是VS2008,已经将mfc90u.dll,msvcr90.dll,microsoft.vc90.CRT.manifest文件都包含进去了,但是还是注册不了。
simouse 2009-06-21
  • 打赏
  • 举报
回复
正好我也遇到这个问题,如楼主说的,MT解决不了问题,请楼主分享下成功的经验吧!
Conry 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yoogle 的回复:]
引用 1 楼 aspower_ 的回复:
于是我查看了我的这个设置文件,如下:,但是拷贝了相关的这些dll到程序所在目录并不起作用

请注册这些dll

regsvr32dll名



LoadLibrary("msvcr90.dll") 失败 - 动态链接库(DLL)初始化例程失败。

无法注册!!
[/Quote]
改成MT就不需要msvcr90.dll了,
yoogle 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aspower_ 的回复:]
于是我查看了我的这个设置文件,如下:,但是拷贝了相关的这些dll到程序所在目录并不起作用

请注册这些dll

regsvr32dll名
[/Quote]

LoadLibrary("msvcr90.dll") 失败 - 动态链接库(DLL)初始化例程失败。

无法注册!!
zfreeze 2009-06-15
  • 打赏
  • 举报
回复
如果楼主不想静态链接(c/c++--->代码生成---》运行时库 改为(多线程/MT) )的话
就只能复制所需的C运行库dll了
fengrx 2009-06-15
  • 打赏
  • 举报
回复
如果想在运行其它也不需要cximage.dll,那就像cximage的Demo一样直接把cximage的代码拷贝过来用。

可能还有其它的方法,请各位补充。
fengrx 2009-06-15
  • 打赏
  • 举报
回复
应该是需要cximage.dll的。
楼主可以使用DEPENDS.EXE查看下使用cximage库的文件,应该有一个依赖项是cximage.dll。
cximage.lib应该是只带着接口信息,运行期间还需要cximage.dll。
yoogle 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fengrx 的回复:]
引用 7 楼 yoogle 的回复:
这样我倒可以试试,我的cximage用的都是静态编译,和主工程是一致的,不需要dll吧?



cximage只需要cximage.dll就可以。
[/Quote]

静态链接还需要dll?不太明白。我觉得静态链接的意思就是将cximage.lib链接到程序中了,不依赖于dll了,动态链接才需要dll吧?
fengrx 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yoogle 的回复:]
这样我倒可以试试,我的cximage用的都是静态编译,和主工程是一致的,不需要dll吧?
[/Quote]


cximage只需要cximage.dll就可以。
yoogle 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fengrx 的回复:]
你和程序运行不起来的根本原因:依赖的库不仅需要DLL文件,还需要对应的.manifest文件。

举例:
如果依赖msvcr80.dll文件,则需要拷贝msvcr90.dll和Microsoft.VC90.CRT.manifest。

对于其它的文件楼主应该知道了,我就不多说了。(自己工程文件、cximage.dll)
[/Quote]

这样我倒可以试试,我的cximage用的都是静态编译,和主工程是一致的,不需要dll吧?
yoogle 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Conry 的回复:]
静态就没问题了

你的还需要改c/c++--->代码生成---》运行时库 改为(多线程/MT)
[/Quote]

一定要改吗?因为还有cximage在里面,如果改了MT,我的工程编译就出问题了,挺麻烦的。
fengrx 2009-06-15
  • 打赏
  • 举报
回复
你和程序运行不起来的根本原因:依赖的库不仅需要DLL文件,还需要对应的.manifest文件。

举例:
如果依赖msvcr80.dll文件,则需要拷贝msvcr90.dll和Microsoft.VC90.CRT.manifest。

对于其它的文件楼主应该知道了,我就不多说了。(自己工程文件、cximage.dll)
yoogle 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 na_he 的回复:]
vcredist_x86.exe这个是一定需要包含在installshield中的,同时确保工程所需要的文件都要在installshield中了。我们中也包含了Microsoft.VC80.MFC这样一个folder.
[/Quote]

我并没有使用installshield制作安装文件,我的想法是尽量做成绿色软件。按照你的方法其实还是需要先安装vcredist_x86.exe,
Conry 2009-06-15
  • 打赏
  • 举报
回复
静态就没问题了

你的还需要改c/c++--->代码生成---》运行时库 改为(多线程/MT)
na_he 2009-06-15
  • 打赏
  • 举报
回复
vcredist_x86.exe这个是一定需要包含在installshield中的,同时确保工程所需要的文件都要在installshield中了。我们中也包含了Microsoft.VC80.MFC这样一个folder.
一笑拔剑 2009-06-15
  • 打赏
  • 举报
回复
于是我查看了我的这个设置文件,如下:,但是拷贝了相关的这些dll到程序所在目录并不起作用

请注册这些dll

regsvr32 dll名
yoogle 2009-06-15
  • 打赏
  • 举报
回复
问题解决了。

首先,还是说之前没有设置成MT是肯定不对的。这样即使设置为静态编译也需要很多的运行库。
其次,我设置成MT后编译不过其实也不是代码的问题,而是有好几个其他的问题,终于还是解决了。感谢以上同学。
Conry 2009-06-15
  • 打赏
  • 举报
回复
你的程序目录树像下面这样就可以了

your.exe
your.dll
-----++Microsoft.VC90.CRT//这是目录对应Microsoft Visual Studio 9-》vc-》redist-》x86,下面的文件也是
------Microsoft.VC90.CRT.manifest
------msvcr90.dll
------msvcp90.dll
Conry 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yoogle 的回复:]
引用 14 楼 Conry 的回复:
引用 13 楼 yoogle 的回复:
引用 1 楼 aspower_ 的回复:
于是我查看了我的这个设置文件,如下:,但是拷贝了相关的这些dll到程序所在目录并不起作用

请注册这些dll

regsvr32dll名


LoadLibrary("msvcr90.dll") 失败 - 动态链接库(DLL)初始化例程失败。

无法注册!!

改成MT就不需要msvcr90.dll了,



我的cximage只能是md的,我的应用程序也只能是md,不然编译过不去。…
[/Quote]

都有源码的,居然编译不过去,说明你代码还有问题
yoogle 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 Conry 的回复:]
引用 13 楼 yoogle 的回复:
引用 1 楼 aspower_ 的回复:
于是我查看了我的这个设置文件,如下:,但是拷贝了相关的这些dll到程序所在目录并不起作用

请注册这些dll

regsvr32dll名


LoadLibrary("msvcr90.dll") 失败 - 动态链接库(DLL)初始化例程失败。

无法注册!!

改成MT就不需要msvcr90.dll了,
[/Quote]

我的cximage只能是md的,我的应用程序也只能是md,不然编译过不去。
现在的问题是:这些文件都有了,为什么还出错呢?

16,472

社区成员

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

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

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