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 依赖项?

删除 MFC DLL 项目的外部依赖项

第三方 dll 在 ASP.NET MVC 项目中找不到它的依赖项

DLL的创建与使用

.NET DLL 引用/依赖检查实用程序