У меня есть библиотека функций 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){...}
Ничего общего с библиотекой не объявляется на стороне клиента.
Задача ещё не решена.
Других решений пока нет …