2 luoyu510183 luoyu510183 于 2017.01.09 15:03 提问

关于VS2015编译的C++工程的DLL路径问题 10C

我用VS2015编译的一个C++工程用到了一个第三方的动态链接库,但是这个库我下载了两个版本。
我用VS进行调试的时候它调用的是我当前环境变量PATH下的库1,但是我直接在工程的bin->debug目录下打开exe文件,这时候这个exe调用的是我之前设置的环境变量PATH下的库2.
所以我的exe在链接DLL的时候,不是从当前的系统环境变量的PATH里面查找的,而是从某个副本环境变量PATH查找相应的DLL文件么?我尝试过把调用DLL的工程清理重新生成,然后直接运行exe文件,这时候链接的DLL还是上一个PATH路径下的,不是当前的PATH路径下的库1.
请教各位,这个问题是由于什么造成的,exe调用的DLL路径倒是由谁来决定的?虽然,我猜测把DLL跟exe放在一个目录下肯定没有这个问题,但是还是想知道其中的原理,谢谢!

4个回答

oyljerry
oyljerry   Ds   Rxr 2017.01.09 15:45

exe加载DLL的时候会有一系列的搜索路径

 假如安全DLL搜索模式启用,搜索顺序如下:
1. 应用程序所在的路径
2. Windows SYSTEM目录。通过调用GetSystemDirectory函数可以获取这个目录的路径。
3. 16位系统的目录。并没有函数可以获取这个目录的路径,但是它会被查找。
4. Windows目录。通过调用GetWindowsDirectory函数可以获取这个目录的路径。
5. 当前目录
6. PATH环境变量指定的路径。请注意,这并不包括每个应用程序的应用程序路径注册表项中指定。在应用程序路径注册表项的键值并不作为DLL的搜索路径。
luoyu510183
luoyu510183   2017.01.10 09:51

谢谢回答!这个搜索顺序我知道,但现在我发现更新了PATH路径之后,在进行VSdebug的时候这个路径更新到了,而在直接运行exe程序的时候使用的路径还是原来的路径。
后来我重启了电脑,然后exe的路径就变成最新的了。所以我怀疑exe使用的路径不是我们看到的系统环境变量的PATH路径,而是这个路径某个备份,每次启动电脑的时候更新什么的。

shen_wei
shen_wei   Ds   Rxr 2017.01.10 16:23

属性,链接器 常规 输出文件 $(OutDir)\$(ProjectName).exe 这里表示了生成exe的路径和文件名。。。。对于外部调用dll,一定要确保路径的正确。

或者你可以放到系统下。。。

luoyu510183
luoyu510183   2017.01.11 17:21

谢谢回答!我的问题在于exe程序和VS2015的本地调试器加载的系统环境变量PATH好像不是一个东西,exe的加载路径重启后才会更新。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
vs2015编译cuda项目
exe demo:C:\Users\sbdya\Documents\Visual Studio 2015\Projects\cuda_test\cuda_test>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc.exe" -ccbin "C:\Program Files (x86)\Microsoft Vis...
vs项目中头文件(.h)静态库(.lib)和 动态库(.dll )的路径和配置问题
在程序开发中,很多时候需要用到别人开发的工具包,如OpenCV和itk。一般而言,在vs中,很少使用源文件,大部分是使用对类进行声明的头文件(.h)和封装了类的链接库(静态.lib或动态.dll)。如果要使用这些类,需要在文件中包含头文件的名字,如#include “cv.h”。但这个并不够,因为这个文件一般来说不在当前目录下。
在VS2015中用C++编写可被其它语言调用的动态库DLL
在VS2015中用C++编写可被其它语言调用的动态库DLL
VS 2015 正确设置DLL路径的方法
-
vs编译cuda工程为DLL
平台:vs2012,x64,cuda 8.0 vs中创建动态链接库项目 项目属性-生成自定义-勾选CUDA 8.0 项目属性-“CUDA C/C++”-“CUDA Runtime”-选择cuda运行时库的链接方式,动态or静态;“Target machine platform”-选择x64 项目属性-“链接器”-“系统”-“子系统”-选择“本机(/SUBSYSTEM/NATIVE)” 编码,编译 异
VS2015 win7下编译提示缺少ucrtbased.dll文件
解决方案:(一劳永逸性方法)方案一中的方案只针对当前的工程项目起作用。另建立一个工程,还会遇到同样的问题,一个一劳永逸的方法是”debug属性页“中设置。第一步:找到”属性管理器“,在”Debug | Win32“上右击,找到属性。如果找不到属性管理器,在视图------其他窗口-------属性管理器。第二步:Debug属性页--------代码生成-----------运行库---------...
vs2015 c文件编译成dll文件
自己对window下的编程不熟悉,花费了一下午时间在编译库文件上,也让自己加深了印象,希望对初学者有帮助吧。 第一,自己不是很确定是否可以进行c的编译,因为很多的库的编译都是c++的文件,不过自己测试后, 发现确是可以把dllmain等自带的cpp文件可以改为c文件,进行编译的,调用也是没有问题的; 第二,自己编译的时候,没有写函数的导出的声明,缺少extern __declspec(dll
关于VS工程编译找不到DLL的解决办法 .
重装系统后又重装了VS2008  写了一个win32 console application的helloworld做测试,结果提示“找不到coredll.dll”,下载到该dll到system32下,又提示找不到mmvcr70.dll,mmvcp70.dll。全部下载后再次编译,提示“无法定位序数于...上”。     初步分析为dll库版本问题,但苦于找不到正确的版本。在另一台机器上拷贝时发现
VS 工程只生成dll不生成lib的解决方案
VS 工程只生成dll不生成lib的解决方案   现在编译就可生成.lib 文件了,然后把添加的文件删除,以后都没问题了. 如果上边的操作是添加现有项,不能产生(.lib)的问题依旧存在. 或者按下面那样将类定义为导出类: #define UNIONPOWERTOOL_ENTITY   __declspec(dllexport)   class  UNIONPOWER
VS2015设置DLL和LIB的输出目录
VS2015设置DLL和LIB的输出目录 DLL设置输出目录工程点击右键–>属性–>链接器–>常规–>输出文件 工程点击右键Configuration Properties–>Linker–>General–>Output File 默认设置,一般为:$(OutDir)$(TargetName)$(TargetExt) 相对路径的起点为xxx.vcxproj 文件所在的目录lib设置输出目录