我想知道,是否可以将代码放置在.dll中,而该.dll是使用其他工具链构建的?并且是否可以使用具有较旧编译器的.lib文件构建来构建具有较新版本的代码?
我知道,第二个不是更好,但我想知道,这是不可能的。
确切地说,我的案子是这样的:
我有a.exe
使用VC7.1构建的b.lib
文件,该文件是使用VC7.1构建的。也会使用a.exe
调用从中c.dll
构建的代码b.dll
。现在,我想编写一个new c.dll
,但可以使用VC9进行编译。(我想这样做,因为我需要一些不支持使用VC7.1进行构建的库。)-我c.dll
也需要b.lib
,但我仍然有它的源代码,因此可以重新编译它。
那么,有可能使其工作吗?如果没有,您能否提供简短的解释,究竟是什么不允许这样做?
这并非完全不可能。主要的问题是,您不可避免地会遇到两个不同的运行时库副本。每个副本保持各自的状态并使用自己的内存分配器。必须精心设计DLL接口,以避免可能引起的事故。
硬性规定是,您永远都不能从DLL中的代码引发异常并将其捕获到EXE中。而且您不能从DLL代码中返回标准的C ++库对象,如std :: string,它们具有不同的实现,并且EXE无法正常破坏该对象,因为它使用了不同的分配器。还有更通用的规则,DLL永远不会返回指向需要由调用方释放的对象的指针。CRT状态可能会引起一些细微的问题,例如errno无法返回正确的错误代码以及语言环境设置错误。总而言之,许多痛苦很难诊断,甚至很难解决。
COM编程模型是一个安全的示例。它从不公开实现,仅公开纯抽象接口。没有例外,只有错误代码。对象由工厂分配,引用计数。并且在绝对必要的情况下,它使用公用堆从CoTaskMemAlloc()进行分配。不是一个流行的编程模型,但这就是需要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句