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

克莱尔

我想知道,是否可以将代码放置在.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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用不同的C ++编译器构建的二进制文件和库如何兼容?

来自分类Dev

使用相同编译器标志的不同 Makefile 会生成不同的二进制文件

来自分类Dev

交叉构建的本机编译器问题:编译器或已编译二进制文件中的段错误

来自分类Dev

如何检查使用哪个编译器生成二进制文件

来自分类Dev

为什么 gcc 会为使用不同形式的整数文字的程序生成不同的编译二进制文件?

来自分类Dev

为什么 Red Hat 提供使用不同 Java 编译器版本编译的构建?

来自分类Dev

找出构建二进制文件的版本吗?

来自分类Dev

从编译的二进制文件中获取golang版本

来自分类Dev

我编译器生成的二进制文件不仅仅包含二进制数,为什么?

来自分类Dev

如何强制编译器或解释器查看二进制数的二进制补码?

来自分类Dev

如何使用c ++ 11为旧Linux版本构建二进制文件?

来自分类Dev

是否可以使用CMake为不同目标构建二进制文件?

来自分类Dev

如何通过编译器更改二进制文件的DWARF信息中包含的调试路径

来自分类Dev

如何获取用于在(.deb)程序包中生成二进制文件的编译器标志?

来自分类常见问题

如何使用Cargo构建多个二进制文件?

来自分类Dev

二进制文件未使用调试信息构建

来自分类Dev

二进制文件未使用调试信息构建

来自分类Dev

使用静态对象构建二进制文件

来自分类Dev

使用go动态创建编译的二进制文件

来自分类Dev

使用VexCL“编译二进制文件”

来自分类Dev

使用gcc编译PowerPC二进制文件并限制可用的寄存器

来自分类Dev

我在C中使用AES加密和解密txt文件时使用不同的二进制文件

来自分类Dev

相同的curl二进制文件在2个不同的服务器上显示了不同版本的openssl

来自分类Dev

用于二进制分发的clang编译器标志(通用CPU)

来自分类Dev

正确的方式包含与预编译的二进制文件和手动编译的二进制文件不同的头文件

来自分类Dev

为什么cmake的安装文件与实际构建的二进制文件不同?

来自分类Dev

g ++编译的二进制文件给出“无法执行二进制文件”

来自分类Dev

SAS:如何对基于二进制变量的绘图使用不同的符号

来自分类Dev

编译二进制

Related 相关文章

  1. 1

    用不同的C ++编译器构建的二进制文件和库如何兼容?

  2. 2

    使用相同编译器标志的不同 Makefile 会生成不同的二进制文件

  3. 3

    交叉构建的本机编译器问题:编译器或已编译二进制文件中的段错误

  4. 4

    如何检查使用哪个编译器生成二进制文件

  5. 5

    为什么 gcc 会为使用不同形式的整数文字的程序生成不同的编译二进制文件?

  6. 6

    为什么 Red Hat 提供使用不同 Java 编译器版本编译的构建?

  7. 7

    找出构建二进制文件的版本吗?

  8. 8

    从编译的二进制文件中获取golang版本

  9. 9

    我编译器生成的二进制文件不仅仅包含二进制数,为什么?

  10. 10

    如何强制编译器或解释器查看二进制数的二进制补码?

  11. 11

    如何使用c ++ 11为旧Linux版本构建二进制文件?

  12. 12

    是否可以使用CMake为不同目标构建二进制文件?

  13. 13

    如何通过编译器更改二进制文件的DWARF信息中包含的调试路径

  14. 14

    如何获取用于在(.deb)程序包中生成二进制文件的编译器标志?

  15. 15

    如何使用Cargo构建多个二进制文件?

  16. 16

    二进制文件未使用调试信息构建

  17. 17

    二进制文件未使用调试信息构建

  18. 18

    使用静态对象构建二进制文件

  19. 19

    使用go动态创建编译的二进制文件

  20. 20

    使用VexCL“编译二进制文件”

  21. 21

    使用gcc编译PowerPC二进制文件并限制可用的寄存器

  22. 22

    我在C中使用AES加密和解密txt文件时使用不同的二进制文件

  23. 23

    相同的curl二进制文件在2个不同的服务器上显示了不同版本的openssl

  24. 24

    用于二进制分发的clang编译器标志(通用CPU)

  25. 25

    正确的方式包含与预编译的二进制文件和手动编译的二进制文件不同的头文件

  26. 26

    为什么cmake的安装文件与实际构建的二进制文件不同?

  27. 27

    g ++编译的二进制文件给出“无法执行二进制文件”

  28. 28

    SAS:如何对基于二进制变量的绘图使用不同的符号

  29. 29

    编译二进制

热门标签

归档