У меня есть настольное приложение C ++, которое может регистрировать сообщения, используя библиотеку ‘spdlog’ (https://github.com/gabime/spdlog). Теперь я хотел бы использовать тот же логгер из динамически загружаемой DLL. Однако, когда я пытаюсь использовать spdlog из DLL, у меня возникает сбой.
Как я могу настроить динамически загружаемую DLL на использование того же регистратора, что и в главном приложении?
Я нашел одну возможную причину проблемы.
spdlog только для заголовка. Если у вас есть две копии журнала, одна в вашем приложении и одна в вашей dll, и вы передаете динамические ссылки из копии spdlog приложения в копию dll, и вы скомпилировали приложение и dll с различными параметрами, вы можете завершить с двумя несовместимыми определениями функций класса spdlog.
Особые оскорбительные варианты:
/Gd Uses the __cdecl calling convention (x86 only).
/GR Enables run-time type information (RTTI).
/Gr Uses the __fastcall calling convention (x86 only).
/Gv Uses the __vectorcall calling convention. (x86 and x64 only)
/vmm Declares multiple inheritance.
/vms Declares single inheritance.
/vmv Declares virtual inheritance.
/vmb Uses best base for pointers to members.
/vmg Uses full generality for pointers to members.
/Zp Packs structure members.
Каждый из этих параметров изменяет интерпретацию каждого объявления в обрабатываемых файлах. Таким образом, одно правило определения было нарушено с неопределенным поведением в качестве наказания.
Других решений пока нет …