我有一个 C++ DSP 函数库,我想在运行时动态链接到它们。我正在使用PDLL.h https://github.com/yielding/code/blob/master/sys.programming/win32.DLLdynamic/PDll.h方法将我的类(例如 FFT)包装到 C 样式函数中,并在其他 C++ 应用程序中动态加载它们。我想在.NET应用程序和COM组件中使用这些函数,所以我必须使用__stdcall
它修饰 32 位版本中的名称。
为了取消修饰名称,我使用了这里提到的技巧:C++ DLL 导出:修饰/损坏的名称 https://stackoverflow.com/questions/2804893/c-dll-export-decorated-mangled-names(wqw的答案,倒数第二)。例如,在我的库的 .h 文件中,我声明了我的包装函数:
#pragma comment(linker, "/EXPORT:DoFFT=_DoFFT@12")
RTLIBS_API DoFFT(FFT* x, DOUBLE* pdDataIn, DOUBLE* pdDataOut);
这确实有效,当我使用 dependency walker 查看 dll 时,我发现有一个 DoFFT 和 _DoFFT@12 的条目。
我遇到的问题是,当我尝试构建链接到该库的项目时(在运行时动态地,根本不使用 .lib 文件),我的 dll 中的所有函数都会出现链接器错误,即:
Error 31 error LNK2001: unresolved external symbol _DoFFT@12
我不明白为什么会发生这种情况。首先,符号 _DoFFT@12 确实存在(根据 dependency walker),其次,为什么链接器首先要寻找它?我在运行时链接到它,而不是在编译时链接到它,那么我的项目如何知道这个符号呢?
所有函数均使用相同的宏链进行声明,该宏链可简化为(例如):
extern "C" __declspec(dllexport) int __stdcall DoFFT(FFT* x){...}
客户端没有声明任何与库无关的内容。