我有一个C ++桌面应用程序,可以使用'spdlog'库(https://github.com/gabime/spdlog)记录消息。现在,我想使用来自动态加载的DLL的同一记录器。但是,当我尝试从DLL使用spdlog时,会崩溃。
如何设置动态加载的DLL以使用与主应用程序相同的记录器?
答案 0 :(得分:0)
我发现了问题的可能原因。
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.
每个选项都会更改正在处理的文件中每个声明的解释。因此,违反了一个定义规则,以未定义的行为作为惩罚。