2

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

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

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

4

2 回答 2

2

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

C++ 的故事完全不同。不同 C++ 编译器生成的工件之间正确互操作性的最臭名昭著的障碍是名称修饰应用程序二进制接口(ABI) 的差异。这通常适用于所有 C++ 编译器,而不仅仅是 MinGW 和 MSVC。如果你想了解更多关于 MSVC 和 MinGW 之间的互操作性陷阱,我鼓励你阅读以下文章:

  1. 不同编译器品牌创建的库的互操作性
  2. 二进制兼容的 C++ 接口
于 2013-04-15T02:00:56.573 回答
1

简单点。

Windows 会说话French
MinGW 说French,GermanEnglish.
Unix系统说话German


MSVC 二进制文件是用French.
MinGW 二进制文件是用FrenchAngloGerman.
UNIX 二进制文件是用German.


Windows 需要 MinGW 翻译一些Germanand EnglishtoFrench才能理解所有内容。


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

于 2013-04-15T01:58:17.877 回答