错误原因
1.静态构造imgui时,所有的代码会在编译时期被放入一个静态库中,Hazel作为一个动态库为其提供链接,换句话说,在编译Hazel的过程中,imgui的静态库会被混合到Hazel的二进制文件中。这个时候如果我们打算在Sandbox项目使用imgui的函数的时候,如果我们让Sandbox也链接到imgui的时候,每个项目都会有一个imgui的实例,它们是不共享的。因此,如果你试图在sandbox中访问由Hazel占用的imgui实例,就可能会引发访问冲突和运行时错误。
2,如果sandbox不直接链接到imgui,而是通过链接Hazel(已链接imgui)来 indirectly 访问imgui,现象是,你只能访问到Hazel有过使用的imgui函数。这是因为,链接器在生成Hazel动态库时,为了减小二进制大小和加载时间,它除非有必要(即Hazel有使用到),否则不会链接imgui中未使用的函数。这也是为什么,动态库会比静态库小的一个重要原因。
3.因为Hazel是不会链接到哪些它未曾使用的函数符号定义,所以sandbox自然也无法从Hazel中得到它想要的函数定义。
解决方案
1.其中一个解决方案是在imgui.h的文件中加入宏定义#define IMGUI_API __declspec(dllexport)
2.还有一种方法,设置def模板文件,把需要的函数定义加入即可。