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

我有一个关于编写程序在Windows和Linux之间可移植的问题。

最近我意识到,如果你编写一个使用任何外部库的程序,如果这个库没有linux版本(或者在linux下开发的时候是windows版本),那么你就搞定了。

这里是我的问题:如果我在linux中编写一个链接到lol.a的程序,然后我想在Windows上编译并运行它,而不用重新编译lol.a到lol.lib中,那么可以像MinGW或Cygwin这样做吗? 链接到Windows平台上的.a文件以生成可以运行Windows的.exe文件?

您将不得不重新编译所有库以用于不同的操作系统。 库的二进制格式因操作系统而异。 更重要的是,即使不使用库,也需要重新编译,原因很简单,因为不同的操作系统有不同的系统调用约定。 解决这个问题的唯一方法就是使用虚拟器。

特别是,CygWin不能运行Linux程序。 在所有。 CygWin只在你的程序和Windows内核之间提供一个posix兼容层。

Linux的情况有点不爽。 Wine可以运行一些本地windows代码(不需要重新编译任何东西,包括原始代码)。 但是葡萄酒也有局限性。 它不是一个完整的Windows API,库代码需要运行的任何东西都必须在Wine上可用,否则它也不起作用。 对于许多简单的应用程序来说,这不是一个主要的问题,但是许多较新的Windows API,旧的那些看不到太多用途的黑暗角落,尤其是硬件特定的东西,可能无法使用。

如果您打算在多个平台上运行,则首先要验证您打算使用的库是否跨平台,或者您希望使用的所有操作系统是否有合理的等价物。

不,Cygwin为* ix程序提供(部分) 可移植性。 当然,还有更高级别的工具包可以提供源码的可移植性,比如QT和GTK。 无论哪种方式,你仍然需要重新编译程序和库。 对于二进制可移植性,你需要与wine相反的一个程序,它理解ELF并将Linux系统和库调用映射到Windows。 据我所知,这并不存在。

不需要。您必须为Windows或Linux分别构建它。

有几个建议给你的情况:

  1. 为Windows开发整个代码,编译并运行它。
  2. 在Linux上,使用WINE模拟器http://www.winehq.org/download/
  3. 如果您选择在Linux中开发代码,请查看Windows SFU http://en.wikipedia.org/wiki/Microsoft_Windows_Services_for_UNIX
  4. 如果可能的话,发布我们想要开发什么样的软件 – 像boost [ http://www.boost.org]这样的第三方库有一整套独立于平台的功能。 你一定要检查提供给你的选项。 也检查出其他开源网站,如github等
  5. 不要养成使用特定于平台的库的习惯。 我知道他们有时会让生活更轻松,但是当你需要在不同的平台上使用这些代码的时候,这种补偿是不够的。