vs编译成功生成exe后运行时,提醒无法启动程序,计算机中丢失xx.dll

qqzheng 2013-10-18 09:32:09
VS2010下编译一个C++的工程无错,成功生成了.exe文件,
但运行这个exe文件时,就提示无法启动程序,计算机中丢失xx.dll。
由于连续提示的xx.dll比较多,就不一一列举。

另发现一个规律,提示计算机丢失xx.dll,如a.dll,b.dll, c.dll...都对应了原工程的属性配置里面链接器下的附加依赖项中a.lib, b.lib, c.lib... (a.lib, b.lib, c.lib...这些都是已有的第三方库文件夹中的,本人直接从编译好的下到自己电脑上,放在一个目录中,这些目录中也有对应的a.dll,b.dll, c.dll,但好像生成的exe并不会自己去找这些目录里的dll)

想搞清楚这个原理,为什么会出现这样的情况,为什么生成的exe会需要去找这些dll,机制是什么?
另主要是想问,该怎样解决这种缺第三方库的dll的情况。


...全文
27868 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
围脖1013 2015-05-21
  • 打赏
  • 举报
回复
查看解决方案启动项是有否更改,正确的应该是.exe调用.dll
ajiecs 2015-05-19
  • 打赏
  • 举报
回复
今天我也遇到这个问题了,基本网上说的办法都不能解决,我自己研究了下发现注册表中的指向的地址一般是IE的地址,如果IE不能正常启动就会出现这种现象,所以当IE不能正常启动的时候,我们把默认浏览器设置成其他浏览器就可以解决这个问题了
neinongda1_2 2014-08-08
  • 打赏
  • 举报
回复
可以参考此网址VS DLL 复制本地http://www.cnblogs.com/nzbbody/p/3436130.html
twwk120120 2014-04-13
  • 打赏
  • 举报
回复
这是一个使用经验的问题,debug/release时查找程序所需文件路径(如dll,lib,资源文件等)和你双击exe查找的方式不一样的。你右键项目-属性-配置属性-调试,看到“工作目录”了吗?这就是你debug/release可以设置的外部文件路径。helloworld工程所需要的资源文件都在这里。而你双击exe时,是没有这个路径的,你需要把“工作目录”里的东西,全都复制到exe所在的目录下。
赵4老师 2014-02-26
  • 打赏
  • 举报
回复
引用 19 楼 luoxuechengbing 的回复:
[quote=引用 13 楼 zhao4zhong1 的回复:] 在64位Windows下,试试手动 将32位的dll拷贝到c:\windows\system32目录下 或 将64位的dll拷贝到c:\windows\syswow64目录下 然后看它能不能被正常调用。
做学生的时候也是用赵老师这种办法,现在不用了;;; 这办法带来的效果很蛋疼; 建议 设置环境变量。[/quote] 我这句话隐含的意思是“肯定不能正常使用”。
赵4老师 2014-02-26
  • 打赏
  • 举报
回复
引用 21 楼 luoxuechengbing 的回复:
[quote=引用 20 楼 zhao4zhong1 的回复:] [quote=引用 19 楼 luoxuechengbing 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 在64位Windows下,试试手动 将32位的dll拷贝到c:\windows\system32目录下 或 将64位的dll拷贝到c:\windows\syswow64目录下 然后看它能不能被正常调用。
做学生的时候也是用赵老师这种办法,现在不用了;;; 这办法带来的效果很蛋疼; 建议 设置环境变量。[/quote] 我这句话隐含的意思是“肯定不能正常使用”。[/quote] 哦,抱歉,没看清楚。 你这是在测试系统是否 环境变量正常引用?[/quote] 证明因为32位dll和64位dll里面机器代码对应的汇编指令不同,所以不可能将它们放在和其不对应的目录下调用。
  • 打赏
  • 举报
回复
引用 20 楼 zhao4zhong1 的回复:
[quote=引用 19 楼 luoxuechengbing 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 在64位Windows下,试试手动 将32位的dll拷贝到c:\windows\system32目录下 或 将64位的dll拷贝到c:\windows\syswow64目录下 然后看它能不能被正常调用。
做学生的时候也是用赵老师这种办法,现在不用了;;; 这办法带来的效果很蛋疼; 建议 设置环境变量。[/quote] 我这句话隐含的意思是“肯定不能正常使用”。[/quote] 哦,抱歉,没看清楚。 你这是在测试系统是否 环境变量正常引用?
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
在64位Windows下,试试手动 将32位的dll拷贝到c:\windows\system32目录下 或 将64位的dll拷贝到c:\windows\syswow64目录下 然后看它能不能被正常调用。
做学生的时候也是用赵老师这种办法,现在不用了;;; 这办法带来的效果很蛋疼; 建议 设置环境变量。
fwleiming 2014-02-13
  • 打赏
  • 举报
回复
只是想知道原理吗, exe文件中有一个叫做“导入描述区”的部分 这里面写明了这个exe会直接用到的一些外部函数, 所谓外部是指不在当前文件中, windows在加载exe文件到内存中的时候会根据这些导入描述里记载的内容, 去加载dll文件,并把dll文件中的对应函数的地址(也就是函数指针)填入“导入表”中 exe在执行过程中要用到这样的外部函数的时候,就会从导入表的特定位置获取这个函数的指针,然后以调用指针指向的函数的方式来执行这样的函数。 这整个过程是由编译器来控制的,编译器生成的代码直接就是这样了(就是我刚刚说的exe会怎么样怎么样来调用函数,是编译的时候就定下来的)。 你平时调用windows api的时候,那些api函数就是以这种方式导入的,对应的lib文件是kernel32.lib user32.lib之类。在VC里,这些lib文件默认就已经帮你写好在工程设置里的。以及,vc默认还会链接C语言运行库msvcrt.lib或者libcmt.lib,在libcmt.lib中也会默认给你引入kernel32.lib,这样。 而这些lib里面的内容,就是“导入描述区”的模板(注意这个和C++中的模板的概念不同)。链接器在生成exe的时候,这些lib是在要链接的库里面的,于是这些lib里的导入描述区的模板被写入exe,并在链接的时候填入对应的数据(其实是exe文件中的偏移,用于定位各种链接时才知道的地址),形成最后的导入描述区(exe里的.idata段,事实上链接器还会根据段的属性不同,最后可能将.idata段合并到其他段中,所以有的exe用工具是看不到.idata段的) 这就是这些lib会使得你的exe对某些dll产生依赖的原因:它们的功能只是提供一个导入描述区的部分,而不是直接提供这些函数的实现。
knva 2014-02-11
  • 打赏
  • 举报
回复
使用管理员权限
ErrorErro 2014-01-18
  • 打赏
  • 举报
回复
需要把dll拷贝到exe相同目录下吧
qqzheng 2014-01-05
  • 打赏
  • 举报
回复
引用 14 楼 bijiaoben 的回复:
把路径增加到环境变量里面不可以吗?
可以的,只是感觉随便个什么都往环境变量里加,那最后就特别长了。以后的程序搜索就很困难。 感觉这个习惯不好
大奶兔白糖 2013-12-18
  • 打赏
  • 举报
回复
把路径增加到环境变量里面不可以吗?
赵4老师 2013-12-16
  • 打赏
  • 举报
回复
在64位Windows下,试试手动 将32位的dll拷贝到c:\windows\system32目录下 或 将64位的dll拷贝到c:\windows\syswow64目录下 然后看它能不能被正常调用。
「已注销」 2013-12-16
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
[quote=引用 9 楼 jha334201553 的回复:] 点击vs上面的调试运行的话,要把dll复制到工程目录下,如果是双击exe运行的话,把dll复制到exe目录下,如果想简单直接复制到%SystemRoot%目录下,这样就不用管32位还是64位了。 也可以在程序中加path的环境变量,或者设置CurrentDirectory
大错特错! 在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; [/quote]自己看msdn,http://msdn.microsoft.com/zh-cn/library/7d83bc18(v=vs.90).aspx 更新:2007 年 11 月 通过隐式和显式链接,Windows 首先搜索“已知 DLL”,如 Kernel32.dll 和 User32.dll。Windows 然后按下列顺序搜索 DLL: 当前进程的可执行模块所在的目录。 当前目录。 Windows 系统目录。GetSystemDirectory 函数检索此目录的路径。 Windows 目录。GetWindowsDirectory 函数检索此目录的路径。 PATH 环境变量中列出的目录。 ------------------------------------------------------------- GetWindowsDirectory 返回的是什么目录??????
赵4老师 2013-12-16
  • 打赏
  • 举报
回复
引用 9 楼 jha334201553 的回复:
点击vs上面的调试运行的话,要把dll复制到工程目录下,如果是双击exe运行的话,把dll复制到exe目录下,如果想简单直接复制到%SystemRoot%目录下,这样就不用管32位还是64位了。 也可以在程序中加path的环境变量,或者设置CurrentDirectory
大错特错! 在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下;
buyong 2013-12-16
  • 打赏
  • 举报
回复
release版直接复制到程序目录下。 debug版注意manifest设置
「已注销」 2013-12-16
  • 打赏
  • 举报
回复
点击vs上面的调试运行的话,要把dll复制到工程目录下,如果是双击exe运行的话,把dll复制到exe目录下,如果想简单直接复制到%SystemRoot%目录下,这样就不用管32位还是64位了。 也可以在程序中加path的环境变量,或者设置CurrentDirectory
赵4老师 2013-12-16
  • 打赏
  • 举报
回复
Windows searches for the DLL file in the following sequence: 1. The directory from which the application loaded. 2. The current directory. 3. Windows 95 and Windows 98: The Windows system directory. Use the GetSystemDirectory function to get the path of this directory. Windows NT: The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. The name of this directory is SYSTEM32. 4. Windows NT: The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is SYSTEM. 5. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory. 6. The directories that are listed in the PATH environment variable.
5t4rk 2013-12-16
  • 打赏
  • 举报
回复
未包含,编译设置为静态编译。 缺少的外部文件拷入当前目录。
加载更多回复(6)

24,851

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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