我有一个 C++ 中的 DSP 函数库,我想在运行时动态链接到它们。我正在使用PDLL.h方法将我的类(例如 FFT)包装到 C 风格的函数中,并在其他 C++ 应用程序中动态加载它们。我想在 .NET 应用程序和 COM 组件中使用这些函数,所以我必须使用__stdcall
32 位构建中的名称来装饰名称。
为了取消装饰名称,我使用了这里提到的技巧:C++ DLL Export: Decorated/Mangled names(wqw 的答案,第 2 下)。例如,在我的库的 .h 文件中,我声明了我的包装函数:
#pragma comment(linker, "/EXPORT:DoFFT=_DoFFT@12")
RTLIBS_API DoFFT(FFT* x, DOUBLE* pdDataIn, DOUBLE* pdDataOut);
这确实有效,当我使用依赖项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){...}
在客户端声明与库无关。