C++ dll 与其他 dll 作为依赖项 (SDL2)
Posted
技术标签:
【中文标题】C++ dll 与其他 dll 作为依赖项 (SDL2)【英文标题】:C++ dll with other dll as dependency (SDL2) 【发布时间】:2017-03-19 00:02:22 【问题描述】:我正在使用 Visual Studio 2017 开发一个 C++ 项目。
我已将 SDL2 安装在自定义目录中(不在 PATH
中)。
我正在创建一个使用 SDL2 的 DLL。
我在项目属性中添加了 SDL2 目录(VC++ Directories -> Library Directories
,我也尝试了Reference Directories
)并且它编译正确。
然后在 Core 程序中,我使用 LoadLibraryA
加载我的 DLL,但它失败了(getLastError()
告诉我错误 126)。
我用 Dependency Walker 查找,但找不到 SDL2.DLL。
我还用Process Monitor查看,我看到它首先在当前目录中寻找SDL2.dll
,然后是PATH
环境变量中的所有目录。由于 SDL2 不在 PATH
目录中,加载失败,故事结束,我很伤心。
我当然可以将SDL2安装目录添加到PATH
变量中,但我不想这样做,因为一些原因。
我的配置有什么需要改变的吗?
谢谢。
解决方案:
我找到了解决方法。
我的核心程序加载lib.dll
,需要SDL2.dll
。
相反,我可以创建另一个 dll,例如 libloader.dll
。在这个中,我使用SetDllDirectory
来判断SDL2.dll
的位置,然后我使用LoadLibraryA
来加载lib.dll
。
因为我在lib.dll
中有一个入口点,所以我只需要将它包装在libloader.dll
入口点中。
这样,我就不必将SDL2.dll
的位置放在核心中。
【问题讨论】:
msdn.microsoft.com/en-us/library/windows/desktop/… 如果dll有依赖,它只搜索dll名称而不搜索绝对?所以我必须设置我的PATH?我有点难过 【参考方案1】:您可以使用 SetDllDirectory 解决此问题;见:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686203(v=vs.85).aspx
(请注意,这有点不标准行为,如果您这样做,您需要注意安全隐患,但请注意。)
【讨论】:
【参考方案2】:一旦我对SetDllDirectory
做了这样的事情:
try
/////////////////set dependencies subfolder relative path:
SetDllDirectory((LPCWSTR)L".\\FDD_DLL_Dependencies\\");
/////////////////load FDD DLL:
HINSTANCE hDLL_FDD_DLL=NULL;
hDLL_FDD_DLL=LoadLibrary((LPCWSTR)L"FDD_DLL.dll");
if(hDLL_FDD_DLL==NULL)
throw "FDD DLL did not load";
catch(char*char_Ptr_Exception)
std::cerr<<"Error: "<<char_Ptr_Exception<<'\n';
【讨论】:
好吧,在这种情况下,它与 PATH 几乎相同,我必须“直接”告诉核心他可以在哪里找到 SDL2.dll @Ludonope 对,编译器不知道依赖 DLL 在哪里,除非您以某种方式指定。 @Ludonope 我不知道为什么你不可能,也许你的项目有特定的要求。 我有我的核心程序,然后是一个使用 sdl2.dll 的 lib.dll。我想要的只是当我在 lib.dll 上 LoadLibraryA 时,lib.dll 告诉在哪里可以找到 sdl2.dll。并且不要将 SDL2.dll 文件夹放在 PATH 或核心程序中。可能VS17有选项,但是我没找到。 @Ludonope This question 及其对应的solution 可能会对您有所帮助。以上是关于C++ dll 与其他 dll 作为依赖项 (SDL2)的主要内容,如果未能解决你的问题,请参考以下文章
Windows C++:编译 DLL 时是不是可以“烘焙”Windows DLL 依赖项? [复制]
如何以编程方式列出 C++ 或 Python 中的 DLL 依赖项?