C动态加载DLL错误

因为Merctce

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

但是,这LoadLibrary给了我错误,并且当我使用依赖遍历器检查.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
/*******************************/

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

我知道我很迷失,因为我告诉我迷路了。你能看看吗?

因为Merctce

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章