Если я объявляю такую функцию:
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
TESTAPI int __stdcall myadd(int a, int b);
Символ в DLL [email protected]
, что имеет для меня смысл (после нескольких часов чтения здесь других вопросов).
Но библиотеки окон, похоже, делают что-то другое. Они также используют __stdcall
(замаскированы под WINAPI
), но символы в библиотеках DLL не имеют названия. Если метод выше, где в библиотеках windows, символ будет myadd
.
Я предполагаю, что они используют файл def для псевдонима символов. Но почему мой линкер знает об этом, когда я связываюсь с одной из этих DLL?
Файлы заголовков Windows объявляют эти функции с помощью WINAPI
, поэтому, если я их назову, компоновщик должен искать декорированное имя, так как это функция __stdcall
. Однако каким-то образом компоновщик знает, как отказаться от названия.
Я попытался воспроизвести это, написав небольшую DLL и удалив украшение имен с помощью файла def. Как и ожидалось, я получаю ошибки компоновщика, поскольку компоновщик все еще ищет украшенное имя. Я сделал это в чистом C, чтобы убедиться, что С++ name mangling не влияет на него.
изменить: уточнить, MSVC 14.0/VS2015, 32-разрядный