2

我有一个 C++ 中的 DSP 函数库,我想在运行时动态链接到它们。我正在使用PDLL.h方法将我的类(例如 FFT)包装到 C 风格的函数中,并在其他 C++ 应用程序中动态加载它们。我想在 .NET 应用程序和 COM 组件中使用这些函数,所以我必须使用__stdcall32 位构建中的名称来装饰名称。

为了取消装饰名称,我使用了这里提到的技巧: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){...}

在客户端声明与库无关。

4

0 回答 0