2013-04-15 65 views
2

我是C++的新手,现在我正在努力编译和链接。 最近我一直在使用cmake,并重新编译一个库(mlpack),使用Boost(Cmake does not find boost 1.51 (windows 8))。C++ windows二进制文件:与MinGW一起使用的条件

在第一次尝试中,我下载了Windows预编译的二进制文件。这没有奏效,我已经解释了我使用的二进制文件是MSVC,而不是MinGW,因此麻烦。事实上,在使用MinGW重新编译boost之后,事情就好了。

在这里,我只想得到一个直觉是什么将MSVC和MinGW的二进制文件之间的差异。我(天真?)认为二进制文件是特定于OS /处理器的。 MSVC的二进制文件包含什么使MinGW无法使用它们?

回答

2

只要它们导出纯C API,将由MSVC和MinGW生成的工件(静态/共享库)(一般适用于其他C编译器)相对比较容易。这使得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
1

要简单。

窗户说话French
MinGW讲话FrenchGermanEnglish
Unix系统发言German


MSVC二进制文件写入French
MinGW二进制文件写在FrenchAngloGerman
UNIX二进制文件写入German


Windows需要的MinGW的一些GermanEnglish的转化为French,才可以明白一切。


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

+0

我仍然感到困惑。这是否意味着一旦你为你的系统进行了编译,你的库仍然不能被系统中的所有程序使用?这是否意味着您需要编译每个现有的编译器?除了为特定编译器编译的二进制文件之外,你永远不能下载任何二进制文件?对于语言的比喻,MSVC的图书馆是法语的,MinGW也讲法语,窗口讲法语,不是? – Vince

+0

@Vince我试图多解释一下。不过,我认为Haroogan为解决问题的原因提供了一些很好的链接。你应该检查出来。 – stardust

+0

谢谢!只是为了澄清:现在我下载了iconv二进制文件,并且我有一个包含iconv.lib的文件夹库......当使用mingw编译其他库时,假设链接到这个库是不合理的?如何知道这些库是否正常? – Vince