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