我开发了一个依赖外部库依赖项(主要是 SDL)的 C++ 应用程序。 希望将库和 DLL 文件一起存储在与
.vcxproj
文件不同的文件夹中。
问题1:如何让Visual Studio“找到”文件夹中的那些DLL?
问题2:构建时我想存储在相同的文件夹结构中,如何实现/可以实现吗?
示例:
Project_folder/SDL/SDL_2/lib/x86
-> 这里是 SDL 2 DLL。
Project_folder/SDL/SDL2_image/lib/x86
-> 更多 DLL。
注意,我需要 Visual Studio 来“获取”DLL 有两个不同的文件夹。
我尝试过的:
关于问题1: 如何在Visual Studio中设置DLL文件的路径? 这似乎对我不起作用,或者至少我无法让它对我有用。但是,如果我将所有 DLL 存储在指定的文件夹中,它确实可以完成这项工作。
关于问题 2: 有关构建后事件的文档 这似乎完成了部分工作。我现在可以将 DLL 复制到其他文件夹,但应用程序将无法加载它们,因为它们需要位于可执行文件所在的位置。
问题1的答案:
要包含一个或多个文件夹中的 DLL 文件,您可以使用以下内容,在项目的
properties
中指定。
添加以下关于在何处查找 DLL 的规范:
Right click your project -> Properties -> Configuration Properties -> Debugging -> Environment ->
对于单路径使用:
PATH=$(ProjectDir)\SDL\SDL_2\lib\x86;%PATH%
对于多个,请在示例中使用
指定:;
PATH=$(ProjectDir)\SDL\SDL_2\lib\x86;$(ProjectDir)\SDL\SDL2_image\lib\x86;%PATH%
注:
$(ProjectDir)
<- Specifies the root directory of your project
PATH=
<- Specifies Absolute path to the root directory of your project.
Must be used otherwise it won't look in the specified path.
%PATH%
<- Modifies or Appends the current Reference without overwriting the core of it.
问题2的答案:
为此,您应该将它们直接添加到 .exe 位置,有一些解决方法,但它太复杂了,不应该这样做。
我通常如何将所有必需的 DLL 复制到我的 targetDirectory 中:
属性 -> 配置属性 -> 构建事件 -> 预链接事件
使用以下命令
copy "$(ProjectDir)DLLs\*.dll" "$(TargetDir)" ping -n 6 127.0.0.1 > nul
以下内容获取所有 .dll 结尾并将它们添加到 TargetDir。
ping 用于延迟它,以便它们在“复制”运行时正确链接,但继续其余部分,在该实例中链接将不正确。
要从不同的文件夹加载它们,应该在代码本身内部完成。
使用或值得阅读的一些参考文献: