了解由C ++生成的特定二进制文件是至关重要的吗?

时间:2019-10-31 13:46:30

标签: c++ dll binary static-libraries abi

我想知道使用哪个编译器编译C ++中的特定库是否很重要?因为我听说过ABI兼容性,所以很好奇它是否重要!

例如,我可以下载用MSVC编译的Windows的OpenCV二进制文件(包括dll和lib),并在用MinGW编译的另一个代码中使用它们吗?

1 个答案:

答案 0 :(得分:5)

这取决于:

如果库的接口是基于C ++的,则需要与库用户正在使用的编译器的C ++ ABI相匹配。通常,这意味着用户需要使用具有相同版本号的相同编译器。

如果该库仅公开一个“扁平的”基于C的接口,即使它是内部用C ++编写的,则只需匹配该库的用户正在使用的编译器的C ABI。 C ABI通常由平台定义,并且在编译器之间通用。

请注意,可以使用标头中定义的“包装器”类将“平面”接口“重构”为基于C ++类的接口。在这种情况下,只要库二进制文件仅公开C兼容功能,它仍将仅依赖于C ABI。

此外,仅在Windows上,有一个称为“ COM”的功能,该功能提供了标准的ABI,以允许程序使用使用不同编译器甚至完全使用不同语言编写的对象。但是,COM类不是普通的C ++类,它们的创建和使用是完全不同的。

在OpenCV的特定情况下,我从未使用过它,而是查看最新版本“ opencv-4.1.1- vc14_vc15 .exe”的下载文件名。这表明它包含与Microsoft的Visual C ++编译器版本14和15(又称为Visual Studio 2015和2017)一起使用的库。如果要与MinGW(使用GCC编译器)一起使用它,则需要获得一个非官方的版本或自己从源代码进行编译。