在Windows世界中的C编译器(MSVC和GCC/MinGW)的具体情况下,您在假设二进制兼容性时是正确的。可以将由GCC编译的C接口DLL链接到Visual Studio中的程序。这是C99项目(如ffmpeg)允许开发人员使用Visual Studio编写应用程序的方式。只需要在DLL中的Microsoft工具链中创建带有lib.exe的导入库。反之亦然,使用mingw.org的pexports或更好的,mingw-w64的gendef工具,可以为MSVC生成的DLL创建一个GCC导入库。
当您进入C++界面世界时,MSVC和GCC的ABI不同且不兼容,这种方便的互操作性会出现问题。它可能工作,也可能不工作,没有保证,也没有努力(当前)正在改变这种情况。此外,调试信息显然是不同的,直到有人在GCC中写入与MSVC调试器兼容的调试信息生成器/写入器(当然还有gdb支持)。
我不认为C99特别改变了函数声明的任何内容,或者在符号定义中处理参数的方式,所以这里也没有问题。
请注意,正如Vijay所说,仍然存在体系结构差异,因此x86库无法在链接到AMD64库时使用。
还回答关于封闭源代码二进制文件和分发所有可用编译器/体系结构版本的附加问题。
这正是您创建封闭源代码二进制文件的方式。除了导入库之外,隐藏DLL的导出也很重要,这使得DLL本身无法用于链接(如果您不希望客户端代码在库中使用私有函数,请参阅例如dumpbin /exports
的输出在MSOffice DLL上,有很多隐藏的东西)。你可以使用像__attribute(hidden)
等这样的东西来达到与GCC相同的效果(我相信,从未使用或尝试过)......
一些编译器的特定点:
MSVC带有四个通过/ MT,/ MD,和/ LD(好吧,其实只有三个在新版本中剩余的)不同的运行时库。除此之外,您必须为每个版本的Visual Studio(包括Service Pack)提供构建以确保兼容性。但是,这是封闭的源代码二进制文件和Windows ...
GCC没有这个问题; MinGW总是链接到Windows(从Windows 98开始)提供的msvcrt.dll,等同于/ MD(也可能是与/ MDd相同的调试库)。但是我有两个版本的MinGW(mingw.org和mingw-w64),它们不保证二进制兼容性。后者更完整,因为它提供了64位选项以及32位,并提供了更完整的头文件/库集(包括DirectX和DDK的相当一部分)。
非常有趣的问题。奇怪的是,即使我在80年代早期和80年代在UN * X的世界中担任调试人员,我从未真正给过这种深刻的想法。当然,我主要是使用符号表作为指导,但是仍然可能存在结构中的比特包装问题以及堆栈中的参数问题。我猜在这个世界上,大部分代码都是用制造商的编译器或GCC的一个或另一个版本编译的,所以它有一个固有的一致性,但这并不是你所要求的。 –