c++动态加载dll报错

Posted

技术标签:

【中文标题】c++动态加载dll报错【英文标题】:c++ dynamically loading dll error 【发布时间】:2018-02-01 08:30:00 【问题描述】:

我正在尝试生成一个 .dll,然后使用另一个应用程序检查它是否可以正确使用。

但是,LoadLibrary 给了我错误,当我使用依赖项walker 检查 .dll 时,它给了我这个错误:

“由于隐式依赖模块中缺少导出函数,至少有一个模块存在未解析的导入。”

当我尝试使用一个对象时会发生这种情况。实际上,我完全迷路了,不知道该怎么做。让我解释一下:

我有一些无法修改的 C++ 代码源。它们被编译为 STATIC 库。 然后,我的任务是生成一个.dll和一个.h,以便客户端可以使用.dll

所以,我的想法不是我需要将函数放在 .h 中,将其导出,然后在生成 的项目的 .cpp 中声明它们>.dll 使用其他我无法修改的代码?

我的第一次尝试是:

假设我有:

项目 1: someApi.hpp(SomeAPI 类)、someApi.cpp

DLL 项目:interace.h、interface.cpp、+ 包括项目 1。

测试 DLL 的客户端项目: main.cpp, interface.h

/** interface.h **/

#include <windows.h>

#ifdef MY_DLL_lib_EXPORTS
#define DLL_API extern "C" __declspec(dllexport)
#else
#define DLL_API extern "C" __declspec(dllimport)
#endif

DLL_API int WINAPI myfirsttry();

/** interface.cpp **/

#include "interface.h"
#include "someApi.hpp"

BOOL APIENTRY DllMain(HANDLE h, DWORD r, LPVOID l) 
    switch (r) 
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
        break;
    
    return true;


DLL_API int WINAPI myfirsttry()  
    SomeAPI someAPI;  // When I comment this, LoadLibrary does not give error.

    return 0; 



/** main.cpp **/

#include <iostream>
#include <windows.h>
#include "interface.h"

int main() 
    HINSTANCE dll;
    dll = LoadLibrary(L"D:\\myLib.dll"); // Sure that route is correct as other valid dll can be loaded
    if (!dll) 
        std::cout << "NOT OK" << endl;
    
    return 0;


/*******************************/
Output: NOT OK
/*******************************/

我使用 add_library($NAME SHARED $SOURCES $HEADERS) 使用 cmake 编译我的 dll

我知道我在这里错过了很多东西,因为我已经说过我迷路了。你能看看吗?

【问题讨论】:

LoadLibrary函数失败时,调用GetLastError如何才能知道究竟是什么错误? 你不是忘记在你的dll项目中#define MY_DLL_lib_EXPORTS了吗? @k.v.否:(我还检查了定义是否有效。 @Someprogrammerdude 它给了我 127:ERROR_PROC_NOT_FOUND。那么是不是说它没有看到任何导出的函数呢? 编辑:我忘记了“SomeAPI someAPI;”问题中的行。当我评论它时,它是好的。那条线是问题的根源。 【参考方案1】:

最后,这是因为应用程序加载的 libstdc++-6 版本与所需的 .dll 不同。在可执行文件的文件夹中手动复制它的正确版本解决了这个问题。我使用 dumpbin 来查看所有依赖项。

【讨论】:

以上是关于c++动态加载dll报错的主要内容,如果未能解决你的问题,请参考以下文章

将数组移交给 C# 中动态加载的 C++ DLL 时出现 System.AccessViolationException

从 C++ 应用程序调试动态加载的 C++/CLI DLL

Unity中动态加载dll文件

动态加载DLL

动态加载vs静态加载

C#中动态加载和卸载DLL