У меня есть библиотека, которая реализует два класса, давайте назовем их A
и B
. A
имеет функцию GetMessage()
, которая возвращает указатель на экземпляр класса B
:
class A
{
...
B *GetMessage();
};
Библиотека прекрасно работает. Я использую файл .defs для экспорта символа.
У меня есть программа, которая создает экземпляр A
и вызывает GetMessage()
. Это хорошо компилируется, но во время соединения я получаю сообщение об ошибке:
error LNK2019: unresolved external symbol "public: class B * __thiscall A::GetMessageA(void)" ... etc. etc.
Если я изменю настройки своего проекта для использования Юникода, то получаю сообщение об ошибке:
error LNK2019: unresolved external symbol "public: class B * __thiscall A::GetMessageW(void)" ... etc. etc.
Если вы не можете определить ошибку, GetMessage()
был переименован в GetMessageA()
в первой ошибке и GetMessageW()
во второй.
Я вижу, что происходит. Visual Studio полностью игнорирует тот факт, что функция GetMessage НЕ является функцией Microsoft, и что-то где-то модифицирует имя функции, чтобы направить вызов функции к правильной реализации на основе моей настройки проекта multi-char / unicode. Однако эта функция никоим образом не возвращает и не обрабатывает текст, это не функция Microsoft, которая поддерживает двойную реализацию, и я ничего не сделал в своем исходном коде, чтобы указать, что это так.
Я НЕ собираюсь разрушать мой совершенно хороший код, переименовывая функцию только для того, чтобы обойти глупость Microsoft.
Как остановить Visual Studio от переименования моей функции при компиляции?
---- UPDATE ----
Следующее работает, но есть ли настройка проекта или что-то, что я могу использовать вместо этого. Предполагается, что этот код является кросс-платформенным кодом, совместимым с Posix, который не содержит хитрых взломов Microsoft!
#ifdef GetMessage
// Microsoft have a #define somewhere that redefines GetMessage() to GetMessageA() or GetMessageW()
// and then nobody can link to this library. If I ever get my hands on a functioning time machine then
// number 1 on the agenda is preventing Microsoft from ever being founded. They are constantly forcing
// me to put kludgy hacks like this into my beautiful code!
#undef GetMessage
#endif