C++动态加载dll错误
c++ dynamically loading dll error
我正在尝试生成 .dll,然后使用另一个应用程序检查它是否可以正确使用。
然而,LoadLibrary
给我错误,当我用 dependency walker 检查 .dll 时,它给了我这个错误:
"At least one module has an unresolved import due to a missing export function in an implicitly dependent module."
当我尝试使用一个对象时会发生这种情况。实际上,我完全迷路了,不知道该怎么做。让我解释一下:
- 我有一些无法修改的 C++ 代码源。它们被编译为静态库。
- 然后,我的任务是,生成一个.dll,和一个.h,以便客户端可以使用.dll.
所以,我的想法不是我需要将函数放在 .h 中,导出它,然后在 .cpp[=51= 中声明它们] 使用我无法修改的其他代码生成 .dll 的项目?
我的第一次尝试是:
假设我有:
项目 1: someApi.hpp (class 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
我知道我在这里错过了很多东西,因为我已经说过我迷路了。你能看看吗?
最后,这是因为应用程序正在加载与所需 .dll 不同版本的 libstdc++-6。在可执行文件夹中手动复制正确的版本解决了这个问题。我已经使用 dumpbin 查看所有依赖项。
我正在尝试生成 .dll,然后使用另一个应用程序检查它是否可以正确使用。
然而,LoadLibrary
给我错误,当我用 dependency walker 检查 .dll 时,它给了我这个错误:
"At least one module has an unresolved import due to a missing export function in an implicitly dependent module."
当我尝试使用一个对象时会发生这种情况。实际上,我完全迷路了,不知道该怎么做。让我解释一下:
- 我有一些无法修改的 C++ 代码源。它们被编译为静态库。
- 然后,我的任务是,生成一个.dll,和一个.h,以便客户端可以使用.dll.
所以,我的想法不是我需要将函数放在 .h 中,导出它,然后在 .cpp[=51= 中声明它们] 使用我无法修改的其他代码生成 .dll 的项目?
我的第一次尝试是:
假设我有:
项目 1: someApi.hpp (class 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})
我知道我在这里错过了很多东西,因为我已经说过我迷路了。你能看看吗?
最后,这是因为应用程序正在加载与所需 .dll 不同版本的 libstdc++-6。在可执行文件夹中手动复制正确的版本解决了这个问题。我已经使用 dumpbin 查看所有依赖项。