【问题标题】:C++ windows binaries: conditions to be used with MinGWC++ windows 二进制文件:与 MinGW 一起使用的条件
【发布时间】:2013-04-15 01:51:31
【问题描述】:

我是 C++ 新手,现在正在努力编译和链接。 最近我一直在使用 cmake 和 make 重新编译一个使用 Boost (Cmake does not find boost 1.51 (windows 8)) 的库 (mlpack)。

在第一次尝试中,我下载了 Windows 的预编译二进制文件。这并没有很好地工作,我已经解释过我使用的二进制文件是用于 MSVC,而不是 MinGW,因此很麻烦。事实上,在使用 MinGW 重新编译 boost 之后,一切正常。

在这里,我想了解一下 MSVC 和 MinGW 的二进制文件之间的区别。我(天真地?)认为二进制文件是特定于操作系统/处理器的。 MSVC 的二进制文件包含哪些内容导致 MinGW 无法使用它们?

【问题讨论】:

    标签: c++ windows linker mingw32 binaries


    【解决方案1】:

    组合由 MSVC 和 MinGW 生成的工件(静态/共享库)相对容易(这通常适用于其他 C 编译器),只要它们导出纯 C API。这使得 C API 非常便携,这也是为什么这么多流行的库仍然喜欢使用纯 C API 的主要原因之一。

    C++ 的故事完全不同。不同 C++ 编译器生成的工件之间正确互操作性的最臭名昭著的障碍是 name manglingapplication binary interface (ABI) 的差异。这通常适用于所有 C++ 编译器,而不仅仅是 MinGW 和 MSVC。如果您想详细了解 MSVC 和 MinGW 之间的互操作性陷阱,我鼓励您阅读以下文章:

    1. Interoperability of Libraries Created by Different Compiler Brands
    2. Binary-compatible C++ Interfaces

    【讨论】:

      【解决方案2】:

      简单点。

      Windows 会说话 French.
      MinGW 会说 FrenchGermanEnglish
      Unix系统说German


      MSVC 二进制文件以French 编写。
      MinGW 二进制文件写在FrenchAngloGerman
      UNIX 二进制文件用German 编写。


      Windows 需要 MinGW 将一些 GermanEnglish 翻译成 French 才能理解所有内容。


      MinGW 与其他程序不同。它基本上是一个介于 Windows 和 Linux 之间的迷你操作系统。所以大多数情况下,它需要修改形式的二进制文件才能正常工作。您在 MinGW 上的 Windows 上开发程序这一事实并不意味着它们将在纯 Windows 上运行而没有任何问题。您仍然需要发布或分发您在程序中使用的 MinGW 库和可执行文件。

      【讨论】:

      • 我还是一头雾水。这是否意味着一旦你为你的系统编译,你的库仍然不能被系统中的所有程序使用?这是否意味着您需要为每个现有的编译器进行编译?除了为您的特定编译器编译的二进制文件之外,您永远无法下载任何二进制文件?语言类比,MSVC 的库是法语的,MinGW 也说法语,windows 说法语,不是吗?
      • @Vince 我试着解释一下。但是,我认为 Haroogan 提供了一些很好的链接来说明问题出现的原因。你应该检查一下。
      • 谢谢!澄清一下:现在我下载了 iconv 二进制文件,并且我有一个包含 iconv.lib 的文件夹 lib ......在使用 mingw 编译其他库时假设链接到这个库是不合理的?如何知道这些库是否正常?
      猜你喜欢
      • 2013-08-02
      • 1970-01-01
      • 2012-04-23
      • 2015-04-08
      • 2021-01-24
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多