C++跨平台编译

31

我使用的是 Windows 7 - 32位 操作系统。

我想要将我的简单C++源代码编译成适用于所有操作系统和架构的可执行文件。

我想要从我的操作系统编译以下操作系统:

  • Windows 32
  • Windows 64
  • Linux 32
  • Linux 64
  • OSX 32
  • OSX 64

是否有可能实现?

注意: 我需要在Win7 32位下为所有操作系统编译C++。


请查看这个关于Linux的问题。 - user657267
6
你需要在每个操作系统上测试它。你不能期望它在所有操作系统上都能正常工作。 - Stefan Weiser
3
除非你可以在 OS X 上测试代码,否则交叉编译没有意义。对于 Linux,下载 VirtualBox 是最简单的方法。 - Dietrich Epp
也可以考虑使用CMake作为构建系统。 - yegorich
9个回答

42

在目标操作系统上编译比交叉编译要容易得多。你需要的是每个操作系统的工具链和一个“make”工具。CMake拥有强大的交叉编译功能。这不是必需的,但可以节省一些钱:获取虚拟化软件(例如VMWare Player是免费的),并在不同的操作系统上运行。

我建议使用clang(OSX)、gcc(Linux)和TDM gcc(Windows)作为工具链(MSVC也很好,但不免费)。32位和64位之间的区别不应该是问题。当你使用不同的编译器时,我建议你打开最严格的编译器标志,以便保持标准。

我还建议您在某处使用连续集成服务器,每个操作系统目标和架构都有一个客户端。这将缓解在一个操作系统中进行的不兼容更改的痛苦。您还可以通过软件包管理器或安装程序来确保安装。

只需搜索网络以了解更多有关交叉编译、工具链和连续集成的信息。


我想为所有操作系统编译C++代码,但只有Win7 32位。 - Temüjin
2
你如何确保它能在其他操作系统上运行?至少Linux是免费的,你可以在虚拟机中运行它(例如VMWare Player也是免费的)。对于OSX,你需要一份不免费的副本... - Stefan Weiser
是的,OSX不是免费的。 :( - Temüjin
3
我知道,操作系统/平台主题可能有些令人沮丧。交叉编译只在嵌入式系统上得到充分发展,那里没有人会考虑在目标设备上进行编译。 - Stefan Weiser
1
"在目标操作系统上编译要比交叉编译容易得多" - 为什么呢?我不是在质疑该陈述的真实性,只是想要更多细节。 - gebbissimo
3
@gebbissimo,简单来说,Linux开发人员比Windows开发人员更擅长制作Linux编译器。在机器级别上,不同的操作系统在不同的平台上与硬件的接口方式也不同。这意味着Linux C++编译器需要与Windows C++编译器不同。现在,你可以编写一个在Windows平台上运行的Linux编译器,但是它将获得比在Linux平台上运行的Linux编译器更少的支持。假设你已经拥有了目标平台的副本进行软件测试(为什么要构建一个无法测试的应用程序呢?)。 - DaMaxContent

12

你需要类似于auto tools或CMake的构建系统,我建议使用后者。有一个名为cookiecutter的Python工具,它允许你使用Python(即BoilerplatePP模板)创建一个简单的CMake/C++模板项目。在该链接中,你可以找到如何使用它创建起始项目的说明。最初的项目应该看起来像这样:

$ tree cpp/
cpp/
├── CMakeLists.txt
├── README.md
├── include
│   └── Calculator.hpp
├── src
│   ├── CMakeLists.txt
│   └── Calculator.cpp
├── test
│   ├── CMakeLists.txt
│   └── CalculatorTests.cpp
└── thirdparity
    └── catch
        └── include
            └── catch.hpp

CMake 从2.6版本开始支持交叉编译。阅读本文可深入了解此问题。 祝你好运。


11

你可以开始使用CMake,并使你的项目准备好在所有操作系统上进行编译。

在某些特殊情况下,您需要适应您的代码,包括预处理器检查您正在使用的操作系统。例如:

#ifdef WIN32
//do some stuff for Windows
#elif __APPLE__
//do some stuff for Apple
#elif __linux__
//do stuff for Linux
#endif

你可以在这个链接中找到所有预定义宏的列表。

要使用你的Win7 32位交叉编译所有内容,你可以使用GCC交叉编译器。 目前,在Windows、Mac和Linux上,GCC或CLANG是唯一可用的编译器。 如果你想为除了Windows 32位之外的其他目标构建项目,请参阅此wiki。

GCC


为什么你的代码需要预处理器检查呢?我有一个真实的应用程序,它并不关心这些。所有与平台相关的内容都被隐藏在现有库中,从标准库开始。 - MSalters
1
@MSalters 每个平台都有自己的情况,尤其是在处理 GUI 应用程序或特殊系统调用时。这取决于您要部署哪些代码。 - madduci
1
你最好使用像Qt这样的库来处理GUI平台依赖性。 - MSalters
2
在Linux中,如果您使用OpenGL应用程序,则有X11特殊命令可用。而在Windows上,Visual Studio也有一些特定于编译器的命令。 - madduci
2
@MSalters Qt不是主题。当您不使用这些框架时,您应该适应每个平台的代码。 - madduci

3
我认为简短的回答是可以,但是我们需要考虑细节(魔鬼总在细节中隐藏)。简要来说,我们有两个问题:源代码兼容性和工具链兼容性。
1. 工具链兼容性。在这里,我们需要考虑三个部分:编译器、库和构建工具。幸运的是,构建工具已经存在,而且不只一个。它们包括著名的make以及其它几种重生版本,如cmake、ninja等等。我更喜欢cmake,因为它最容易使用,但你也可以选择你喜欢的任何武器。编译器方面,GCC是一个好选择,但今天我们也有CLang,它同样是一个好选择。我会选择CLang,因为它更加有趣,更加清晰,并且在Windows上得到了更好的支持。另一个好选择是英特尔C++/C,但它需要花费一定的成本。另一种方式是为不同的系统使用不同的编译器,这也是一个不错的选择。Boost就是这样做的,而且boost团队是最好的之一。你可以深入研究boost配置并获取许多有趣的宏和头文件。C++标准库和其他库。这是最棘手的事情之一。C++在某种程度上是标准的,但在更新后可能会出现问题。其他库应该使用你用于特定系统的编译器进行构建。因此,要准备好使用库包分发软件的情况。另一个好选择是依赖于第三方跨平台库,如Qt或WxWidgets。
2. 源代码兼容性与特定的各种操作系统子系统实现密切相关。例如,线程、共享内存、套接字、散列-收集I/O、图形用户界面等。通常情况下并不是非常复杂,但编写所有这些包装器需要一定时间。

2

在使用Windows 10操作系统的情况下,通过CLion集成开发环境和WSL功能,实现编写代码时使用Linux编译器工具链(通常为GCC),并在Windows主机上进行工作。然后,您当然也可以切换到像MinGW这样的Windows工具链,或者使用Visual StudioMSVC再次进行编译,以获取您的Windows二进制文件。

在一天结束时,这使您同时拥有两个二进制文件,而感觉就像您一直在使用Windows一样。有些人说WSLMicrosoft近年来做的最好的事情之一。确实,它非常适合跨平台C/C++开发。
请注意,这不包括为OS X编译,因此您仍然需要拥有一个Mac或运行OS X的虚拟机,不幸的是。

2
只是想指出,从技术上讲,如果你的问题是想在Windows 7上编译相同的代码,但是针对其他操作系统,那么你需要为所有这些不同的目标构建交叉编译器,以便在Windows上工作。为此,我认为你最好使用Cygwin或MinGW32,并从GCC源代码构建各种体系结构的交叉编译器。GCC(可能还有clang)是唯一支持所有目标的自由编译器。构建交叉编译器并不容易,但应该是可行的。参考文献如下: 那些说“使用CMake!”的答案给了你很好的建议,因为他们鼓励你使用一个可以本地支持构建所有这些系统的源码的构建系统,但如果你真的只能在Windows 7上构建,那么使用CMake对你没有任何好处。

1

Golang提供简单的交叉编译(指定$GOOS和$GOARCH并运行"go build");根据您的要求(例如,您需要硬实时操作系统),它可能是合适的工具。


我并不是直接回答作者的问题,而是提示作者(和其他有同样问题的人)考虑可能更好的替代方案。在这里采取实用主义有什么问题吗? - Homer Simpson

1

CMake被用作元语言,因为它抽象了所有工具链和操作系统依赖项。当然它很有用,但第一次使用可能会很困难...

实际上,你需要的是CMake在幕后使用的东西: 1. 每个目标操作系统的编译器 2. 一个良好编写的makefile

你可以打开标志来修改makefile的行为,或者如果你真的想要简化版本,只需在构建代码时调用正确的编译器(针对所需的操作系统)。


1
作为之前回答的内容,CMake 是最好的跨平台编译工具链。它可以为您提供 Visual Studio 解决方案、Makefiles、Eclipse 项目等,适用于上述所有平台。
您也可以尝试使用 SCons,它不太知名,但更加简单。

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