VS2017 设置 dll 目录
前言
C++ 中有静态库和动态库。在 windows 系统中,静态库文件后缀名为 .lib,一般保存在 lib 文件夹里;而动态文件分为两部分:以 .lib 为后缀的引入库或导入库文件,一般存放于 lib 文件夹;以 .dll 为后缀的动态库文件(这样称呼不知道是否合适),一般存放于 bin 文件夹。
在开发过程中,配置第三方库涉及到头文件(.h后缀),lib文件和 dll 文件(只有静态库情况下应该涉及不到 dll 文件,以下假设存在 dll 文件说明)。
在 visual studio 开发工具中,大致有两种开发模式:debug 模式和 release 模式,对于这两种模式,头文件和 lib 文件是不做区分的,而 dll 一般情况下需要做区分,即 debug 模式下使用 debug 模式的 dll 文件(相应的需要有 pdb 文件),release 模式下使用 release 模式的 dll 文件。一般情况下我们只有 dll 模式的文件,除非我们能够拿到第三方库源代码进行 debug 和 release 模式的编译。
visual studio 解决方案和项目需要分清,一个解决方案可以包含多个项目。
配置
这里项目只有两种模式:debug|x64,release|x64。
第三方库为 vtk,项目为 qt5 项目。
vtk 经过编译和 install 后,我们得到四个文件夹如下表:
文件夹 | 说明 |
---|---|
include | 存放 .h 文件 |
lib | 存放 .lib 文件 |
bin\debug | 存放 .dll 文件,对应 vtk debug 编译 |
bin\release | 存放 .dll 文件,对应 vtk release 编译 |
下面的操作需要在 属性管理器(Property Manager) 里进行。在该界面属性按项目分组,这里只有项目QtWADemo,该项目存在两种模式:Debug | x64,Release | x64,不同模式下有各自的属性文件。其中 Qt 是 创建 Qt 项目后存在的属性文件,vtk 是为了配置 vtk 库新建的属性文件。当然后边对 vtk 的操作也可以在 Qt 或 Microsoft.Cpp.x64.user 上进行,但是个人不建议这样做。
新建 vtk 属性文件的操作如下:对 Debug | x64 右键,点击菜单第一行,看到如下界面。可以重命名,选择保存位置(这里保存在项目目录里的 props\debug 文件里(新建))。同样的,对 Release | x64 右键,点击菜单第一行,重命名和选择保存位置(这里保存在项目目录里的 props\release 文件夹里)。
1. 添加头文件目录
双击 Debug | x64 里的 vtk,或者右键它选择 属性(properties)
VC++ 目录
→
\rightarrow
→ 包含目录(VC++ directories
→
\rightarrow
→ include directories),点击右侧下箭头选择编辑(edit)
把 include 文件夹的 绝对路径 添加进去,点击 确定(ok) 。
(这里先不理 $(vtk_root),它是在 vtk 中添加的自定义宏,关于自定义宏最后会说明,这里只需要把绝对路径加进去就行)
Release | x64 的 vtk 也是同样的操作,这里不再重复,可以先在 Debug | x64 里搞完以下步骤,再操作 Release | x64。
3. 添加 lib 文件目录
步骤2界面不要退出
VC++ 目录
→
\rightarrow
→ 库目录(VC++ directories
→
\rightarrow
→ library directories),点击右侧下箭头选择编辑(edit)
把 lib 文件夹的绝对路径添加进去,点击确定(ok)。
Release | x64 同样。
4. 设置链接
步骤3界面不退出
链接器
→
\rightarrow
→ 输入
→
\rightarrow
→ 附加依赖(Linker
→
\rightarrow
→ Input
→
\rightarrow
→ Addictional Depedences) ,把 lib 文件夹里的所有 lib 文件名添加进去。
点击 确定(ok)。
Release | x64 同样。
获取所有 lib 文件名的 python 代码如下。
import os
dir_path = 'C:\\_cmake\\ext\\vtk\\lib'
for root, dirs, files in os.walk(dir_path):
for file in files:
if file.endswith('.lib'):
print(file)
break
5. 添加 dll 目录
(终于到这一步了,其实以上都不是我想说的,重点是 dll 目录这块,网上没有找到详尽的解释,这也是这篇文章的重点)
这里涉及到环境变量 PATH。程序运行是如果想链接 dll 文件,会从 PATH 里的所有文件夹里去查找(这是我的理解),但是这样对于开发不友好,不能做到程序独立,程序可能不会从我们期望的文件夹里查找需要的 dll 文件。
vs 中解决 找不到 dll 文件的方案至少有 4 钟,参见 vs2017 中指定存放dll目录的几种方法
个人偏爱第四种,具体步骤如下:
双击 Debug | x64
可以看到界面与 vtk 的属性界面不同,第二行是 调试(debugging)
修改 环境(Environment) 内容。首先,我们需要 取消勾选 最后一行的继承(Inherit);然后,修改第一个框里边的内容为 PATH=%PATH%;文件夹1;文件夹2;
修改完之后需要保证第二个框里面的值必须是一个 PATH=。。。 的形式,保存。
原理上就是修改该项目使用的 PATH 环境变量的值,指向我们期望的目录,由于我们取消了继承,要注意项目自己添加的目录也要包含在 PATH 里,具体可以观察图片里的内容。这部分需要了解环境变量的相关知识:分号是分隔不同文件夹的。%PATH%是PATH原来的值,类似于 a = a + b。
一般情况下,Release | x64 中 dll 目录与 Debug | x64 中 dll 目录不同。
后言
关于属性文件中的自定义宏(Macros),如果打开属性文件的属性界面,可以看到用户宏(User Macros) 字样,这里可以添加自定义宏。注意宏的作用范围。