我需要验证我有疑问的东西。如果共享库(.dll)用C编写,则使用C99标准编写并在编译器下编译。说明。然后,以我的经验,它是二元兼容的,因此可以从任何其他编译器中使用。说MS Visual Studio。我之所以这样说,是因为我已经成功尝试了一次。但是我需要验证这是否是规则。

此外,我想问一下是否确实是这样,那么为什么库完全写在C中,例如OpenCV,例如不为每个不同的操作系统提供编译的二进制文件?我知道明显的原因是设置所有编译时参数,但除此之外,没有什么对吗?

编辑:我正在添加一个其他问题,我将其视为原始问题的逻辑扩展。这不是一个人会如何创建封闭的源库?由于提供源的选项不在那儿,因此唯一的选择是唯一的选择。在这种情况下,为尽可能多的架构提供二进制方法是理想的结果,C是系统和编译器之间具有最佳便携性的明显选择。正确的?

有帮助吗?

解决方案

在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 Import LIB。

当您进入C ++接口世界时,这种方便的互操作性会破裂,其中MSVC和GCC的ABI与众不同且不兼容。它可能起作用,可能不会,没有保证,也没有(目前)在改变这一点时(目前)没有做出努力。另外,调试信息显然是不同的,直到有人在GCC中写了与MSVC的调试器兼容的调试信息生成器/作家(当然是GDB的支持)。

我认为C99并没有专门更改任何功能声明或在符号定义中处理参数的方式,因此这里也没有问题。

请注意,正如Vijay所说,仍然存在架构差异,因此链接到AMD64库时无法使用X86库。


还要回答有关封闭源二进制文件的其他问题,并为所有可用的编译器/架构分发版本。

这正是您创建封闭源二进制的方式。除导入库外,从DLL隐藏导出,使DLL本身无用(如果您不希望客户端代码在库中使用私有功能,请参见例如输出),这也非常重要。 dumpbin /exports 在Msoffice DLL上,那里有很多隐藏的东西)。您可以使用诸如 __attribute(hidden) ETC...

一些编译器特定点:

  1. MSVC通过 /MT, /MD和 /LD带有四个(实际上,在较新版本中仅剩余三个)。最重要的是,您必须为每个版本的Visual Studio(包括服务包)提供一个构建,以确保兼容性。但这是封闭的源二进制和窗口。

  2. 海湾合作委员会没有这个问题; mingw始终链接到Windows提供的MSVCRT.DLL(由于Windows 98),等效于 /MD(也许也是与 /MDD相当的调试库)。但是我有两个版本的mingw(mingw.org和mingw-w64),这些版本不能保证二进制兼容性。后者更加完整,因为它提供了64位选项以及32位,并提供了更完整的标题/库集(包括DirectX和DDK的大部分)。

其他提示

一般规则是,如果您的OS/CPU组合具有标准ABI,并且如果该ABI足够强大,则大多数编译器都会遵循ABI,因此将兼容二进制,使您可以链接库(共享或共享或共享或静态)与不同的编译器一起编译,以与其他编译器编译的程序进行编译。

问题是大多数ABI都很弱 - 它们围绕C和Fortran等低级语言设计,并可以追溯到C ++等面向对象的语言之前的日子。因此,他们倾向于缺乏对功能过载,用户定义的操作员,异常,全局构图和破坏者,虚拟功能,继承以及C ++所需的支持的支持。

当设计C ++时,这种缺乏被认可,这就是为什么C ++具有 extern "C" - 这使编译器将自己限制在某些功能的标准ABI上,同时禁用ABIS通常不支持的所有额外C ++功能。

编译为特定体系结构的共享库或DLL可以链接到针对相同体系结构的其他编译器编制的应用程序。 (通过体系结构,我的意思是处理器/OS组合)。但是,对于图书馆开发人员而言,对所有可能的架构进行编译是不切实际的。此外,当库以源形式分发时,用户可以构建针对其特定要求优化的二进制文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top