Проблема со связью с декорированными именами DLL в C++ (32 бит) в Visual Studio
У меня есть библиотека функций DSP в C++, и я хочу динамически ссылаться на них во время выполнения. Я использую метод PDLL.h, чтобы обернуть мои классы (например, FFT) в функции в стиле C и загрузить их на лету в другие приложения C++. Я хочу использовать эти функции в приложениях.NET и COM-компонентах, поэтому я должен использовать __stdcall
который украшает имена в 32-битных сборках.
Для того, чтобы отменить оформление имен, я использую трюк, упомянутый здесь: C++ DLL Export: Украшенные / искаженные имена (ответ wqw, 2-й вниз). Так, например, в файле.h моей библиотеки я объявил свои упакованные функции так:
#pragma comment(linker, "/EXPORT:DoFFT=_DoFFT@12")
RTLIBS_API DoFFT(FFT* x, DOUBLE* pdDataIn, DOUBLE* pdDataOut);
Это действительно работает, и когда я смотрю в dll с помощью обходчика зависимостей, я вижу, что есть и запись для DoFFT и _DoFFT@12.
Проблема, которая у меня есть, заключается в том, что когда я пытаюсь создать проект, который ссылается на эту библиотеку (динамически, во время выполнения, вообще не используя файл.lib), я получаю ошибки компоновщика для всех функций в моей dll, то есть:
Error 31 error LNK2001: unresolved external symbol _DoFFT@12
Я не понимаю, почему это происходит. Во-первых, символ _DoFFT @ 12 существует (в соответствии с обходчиком зависимостей), и, во-вторых, почему компоновщик ищет его в первую очередь? Я ссылаюсь на него во время выполнения, а не во время компиляции, так как мой проект узнает об этом символе?
Все функции объявлены с одной и той же цепочкой макросов, которая сокращается до (например):
extern "C" __declspec(dllexport) int __stdcall DoFFT(FFT* x){...}
Ничего общего с библиотекой не объявляется на стороне клиента.