gpt4 book ai didi

C++动态加载dll错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:52:08 24 4
gpt4 key购买 nike

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

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

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

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

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

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

我第一次尝试时所做的是:

假设我有:

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

DLL 项目:interace.h、interface.cpp、+ include 项目 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

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

最佳答案

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

关于C++动态加载dll错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48558329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com