gpt4 book ai didi

c++ - 混合使用不同编译器版本构建的二进制文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:02 25 4
gpt4 key购买 nike

我想知道,是否可以将调用代码放在使用不同工具链构建的 .dll 中?是否可以使用使用较旧编译器构建的 .lib 文件来构建带有较新编译器的代码?

我知道,第二种不太可取,但我想知道,是不是不可能。

准确地说,我的情况是这样的:

我有使用 b.lib 文件用 VC7.1 构建的 a.exe 文件,该文件也是用 VC7.1 构建的。 a.exec.dll 调用代码,该代码也是使用 b.dll 构建的。现在我想写一个新的c.dll,但是用VC9编译。 (我想这样做,因为我需要一些不支持使用 VC7.1 构建它们的库。)——我的 c.dll 还需要 b.lib,我仍然有源代码,因此我可以重新编译它。

那么,有没有可能让它发挥作用呢?如果不是,您能否提供一个简短的解释,具体是什么不允许这样做?

最佳答案

这并非完全不可能。主要问题是您将不可避免地得到 两个 运行时库的不同拷贝。每个拷贝都保持自己的状态并使用自己的内存分配器。必须仔细设计 DLL 接口(interface),以避免可能导致的错误。

硬性规则是您永远不能从 DLL 中的代码中抛出异常并在 EXE 中捕获它。而且您不能从 DLL 代码返回标准 C++ 库对象,如 std::string,它们具有不同的实现,并且 EXE 无法正确销毁该对象,因为它使用了不同的分配器。更一般的规则是,DLL 永远不能返回指向需要由调用者释放的对象的指针。 CRT 状态可能会导致一些细微的问题,例如 errno 未返回正确的错误代码和区域设置错误。总而言之,有很多痛苦很难诊断,甚至更难解决。

COM 编程模型是一个安全的例子。它从不公开实现,只公开纯抽象接口(interface)。没有异常,只有错误代码。对象由工厂分配并进行引用计数。在绝对必要的情况下,它使用公共(public)堆从 CoTaskMemAlloc() 进行分配。不是流行的编程模型,但这就是它所需要的。

关于c++ - 混合使用不同编译器版本构建的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19360059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com