在Windows和Linux之间实现C++的可移植性

4
我有一个关于编写可在Windows和Linux之间移植的程序的问题。
最近我意识到,如果你编写了一个使用任何外部库的程序,并且该库没有Linux版本(或者在Linux上开发时没有Windows版本),那么你就会遇到麻烦。
我的问题是:如果我在Linux中编写了一个链接到lol.a的程序,然后我想在Windows上编译和运行它,而不需要将lol.a重新编译为lol.lib,像MinGW或Cygwin这样的工具可以做到吗?在Windows平台上链接到.a文件,生成一个Windows可以运行的.exe文件?
4个回答

5
您需要为不同的操作系统重新编译所有库。每个操作系统的二进制库格式都不同。更重要的是,即使您不使用库,也需要重新编译,因为不同的操作系统有不同的系统调用约定。唯一的解决方法是使用虚拟化器。
特别是CygWin无法运行Linux程序。 CygWin仅在您的程序和Windows内核之间提供了一个posix兼容层。
在Linux上情况稍微好些。Wine可以运行一些本地Windows代码(无需重新编译任何内容,包括您的原始代码)。但是Wine也有限制。它不是完整的Windows API,并且库代码需要运行的任何内容都必须在Wine上可用,否则也无法工作。对于许多简单的应用程序,这不是一个主要问题,但许多新的Windows API,某些不常使用的旧API的黑暗角落以及特别是任何硬件特定的东西可能不可用。
如果您打算在多个平台上运行,请首先验证您打算使用的库是否跨平台,或者所有希望使用的操作系统都有合理的等效库。

3

不,Cygwin为Unix程序提供了(部分)源代码可移植性。当然,还有更高级的工具包也提供了源代码可移植性,例如QT和GTK。但无论如何,您仍然需要重新编译程序和库。如果要进行二进制可移植性,则需要类似Wine相反的程序,该程序可以理解ELF并将Linux系统和库调用映射到Windows系统调用上。据我所知,这样的程序不存在。


不幸的是,我更喜欢从Linux转到Windows而不是相反。当然,C++除外,因为它在Linux上的支持非常糟糕。 - Matt Joiner
3
当然,除了C++,它的Linux支持很差。 - Matthew Flaschen

1
不行,你必须要分别为Windows或Linux构建它。

0

根据您的情况,有几个建议:

  1. 在Windows上开发整个代码,编译并运行。
  2. 在Linux上使用WINE模拟器http://www.winehq.org/download/
  3. 如果您选择在Linux上开发代码,请查看Windows SFUhttp://en.wikipedia.org/wiki/Microsoft_Windows_Services_for_UNIX
  4. 如果可能,请告诉我们您正在尝试开发什么样的软件--第三方库(如boost [http://www.boost.org])具有许多平台无关的功能。您一定要查看boost提供的选项。还要查看其他开源网站,如github等。
  5. 不要养成使用特定于平台的库的习惯。我知道它们有时会使生活更轻松,但当您需要在不同的平台上使用代码时,这种便利是可以弥补的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接