【问题标题】:C++ dll with other dll as dependency (SDL2)C++ dll 与其他 dll 作为依赖项 (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 的位置放在核心中。

【问题讨论】:

标签: c++ visual-c++ dll


【解决方案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 可能会对您有所帮助。
    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2016-10-12
    • 2017-04-14
    相关资源
    最近更新 更多