gpt4 book ai didi

C 中的交叉编译器二进制兼容性

转载 作者:太空狗 更新时间:2023-10-29 16:48:30 30 4
gpt4 key购买 nike

我需要验证我有疑问的事情。如果共享库 (.dll) 是用 C 语言编写的,符合 C99 标准并在编译器下编译。说 MinGw。然后根据我的经验,它是二进制兼容的,因此可以从任何其他编译器使用。说 MS Visual Studio。我说以我的经验,因为我已经不止一次成功地尝试过。但我需要验证这是否是规则。

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

编辑:我添加了一个额外的问题,我认为这是对原始问题的逻辑扩展。这不是创建封闭源代码库的方式吗?由于提供源代码的选项超出了窗口范围,因此提供二进制文件是唯一的选择。在那种情况下,为尽可能多的体系结构提供二进制文件是理想的结果,C 是在系统和编译器之间具有最佳可移植性的明显选择。对吧?

最佳答案

在 Windows 世界中的 C 编译器(MSVC 和 GCC/MinGW)的特定情况下,您对二进制兼容性的假设是正确的。可以将 GCC 编译的 C 接口(interface) DLL 链接到 Visual Studio 中的程序。这就是 ffmpeg 等 C99 项目允许开发人员使用 Visual Studio 编写应用程序的方式。只需使用在 Microsoft 工具链中从 DLL 中找到的 lib.exe 创建导入库。反之亦然,使用 mingw.org 的 pexports 或更好的 mingw-w64 的 gendef 工具,可以为 MSVC 生成的 DLL 创建 GCC 导入库。

当您进入 C++ 接口(interface)世界时,这种便利的互操作性就会崩溃,因为 MSVC 和 GCC 的 ABI 不同且不兼容。它可能有效,也可能无效,没有任何保证,也没有(目前)正在努力改变它。此外,调试信息明显不同,直到有人在 GCC 中编写了与 MSVC 调试器兼容的调试信息生成器/编写器(当然还有 gdb 支持)。

我不认为 C99 对函数声明或在符号定义中处理参数的方式有任何特别的改变,所以这里也不应该有问题。

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


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

这正是您创建闭源二进制文件的方式。除了导入库之外,隐藏 DLL 的导出也很重要,使 DLL 本身无法用于链接(如果您不希望客户端代码使用库中的私有(private)函数,请参见例如输出 dumpbin/exports 在 MSOffice DLL 上,那里有很多隐藏的东西)。您可以使用 GCC(我相信,从未使用或尝试过)使用 __attribute(hidden) 等实现同样的事情...

一些编译器特定点:

  1. MSVC 通过/MT、/MD 和/LD 提供了四个(嗯,实际上在新版本中只剩下三个)不同的运行时库。最重要的是,您必须为每个版本的 Visual Studio(包括 Service Pack)提供一个构建以确保兼容性。但这对您来说是封闭源二进制文件和 Windows...

  2. GCC 没有这个问题; MinGW 始终链接到 Windows 提供的 msvcrt.dll(自 Windows 98 起),等同于/MD(也可能是等同于/MDd 的调试库)。但是我有两个版本的 MinGW(mingw.org 和 mingw-w64)不保证二进制兼容性。后者更完整,因为它提供 64 位和 32 位选项,并提供更完整的 header /库集(包括 DirectX 和 DDK 的重要部分)。

关于C 中的交叉编译器二进制兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6817141/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com