我想知道使用哪个编译器编译C ++中的特定库是否很重要?因为我听说过ABI兼容性,所以很好奇它是否重要!
例如,我可以下载用MSVC编译的Windows的OpenCV二进制文件(包括dll和lib),并在用MinGW编译的另一个代码中使用它们吗?
答案 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编译器)一起使用它,则需要获得一个非官方的版本或自己从源代码进行编译。