C ++跨平台编译

时间:2014-08-06 05:47:34

标签: c++ cross-platform cross-compiling

我正在使用 Windows 7 - 32位操作系统。

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

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

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

有可能吗?

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

9 个答案:

答案 0 :(得分:29)

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

我会推荐clang(OSX),gcc(Linux),TDM gcc(Windows)作为工具链(MSVC也不错,但不是免费的)。 32位和64位之间的差异应该不是问题。当你使用不同的编译器时,我建议通过在每个编译器上打开最迂腐的编译器标志来坚持标准。

我还建议您在每个操作系统目标和体系结构的某个客户端上安装一个持续集成服务器。这可以减轻您在一个操作系统中进行的不兼容更改的痛苦。您还可以通过包管理器或安装人员确保安装。

只需在网上搜索有关交叉编译,工具链和持续集成的更多信息。

答案 1 :(得分:10)

你需要一个像自动工具或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版的交叉编译。阅读this article以深入了解此问题。 祝你好运。

答案 2 :(得分:7)

您可以开始使用CMake,并为所有操作系统中的编译器准备好项目。

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

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

在此link处,您可以找到所有预定义宏的列表。

要仅使用Win7 32bit交叉编译所有内容,您可以使用GCC交叉编译器。 到目前为止,GCC或CLANG是Windows,Mac和Linux上唯一可用的编译器。 如果您想为其他目标构建项目而不是仅构建Windows 32位

,请关注此Wiki

GCC

答案 3 :(得分:2)

我认为简短的答案是肯定的,但我们有详细信息(魔鬼总是隐藏在细节中)。简而言之,我们有两个问题:源兼容性和工具链兼容性。

  1. 工具链兼容性。这里我们需要考虑3个部分:编译器,库和构建工具。幸运的是,构建工具存在,甚至不存在。它在所有轮回,cmake,忍者等都是着名的制作。我更喜欢cmake作为最简单但你可以随时拿起你选择的武器。编译器。海湾合作委员会是不错的选择,但今天我们有CLang也是不错的选择。我敢打赌CLang是更有趣的解决方案,它更清晰,更好地支持Windows。另一个不错的选择是英特尔C ++ / C,但它的成本。另一种方法是为不同的系统使用不同的编译器,这也是不错的选择。推动这一点,提升团队是最好的之一。你可以深入了解boost配置并获得许多有趣的宏和头文件。 C ++标准库和其他库。这是最棘手的事情之一。 C ++有些标准,但在更新后可能会出现问题。其他库应该使用您用于特定系统的编译器构建。因此,请准备好使用库捆绑软件分发您的软件。另一个不错的选择是依赖第三方跨平台库,如Qt或WxWidgets。

  2. 在特定的各种OS子系统实现中,源兼容性非常紧密。例如,线程,共享内存,套接字,分散 - 收集I / O,GUI。通常它不是很复杂,但需要时间来编写所有包装器。

答案 4 :(得分:1)

cmake用作元语言,因为它抽象了所有工具链和操作系统依赖关系;确定它很有用,但第一次使用时很难使用......

你真正需要的是cmake在幕后使用的东西:   1.每个目标OS的编译器   2.写得好的makefile

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

答案 5 :(得分:1)

之前的回答CMake是最好的跨平台编译工具链。它为您上面提到的所有平台生成Visual Studio解决方案,Makefile,Eclipse项目等

你也可以尝试SCons,它有点鲜为人知,但有点简单

答案 6 :(得分:1)

Golang提供easy cross-compilation(指定$ GOOS和$ GOARCH并运行" go build");根据您的要求(例如,您是否需要硬RTOS),它可能是适合该工作的工具。

答案 7 :(得分:0)

请指出,从技术上讲,如果你的问题是你想要在Windows 7上编译相同的代码 针对那些其他操作系统,那么你需要什么是一个交叉编译器,适用于所有那些可以在Windows上工作的目标。为此,我认为您最好的选择是使用Cygwin或MinGW32,并从GCC源为您的各种架构构建交叉编译器。 GCC(可能是clang)是唯一的a)免费编译器,并且b)能够支持所有目标。构建交叉编译器并不容易,但应该是可行的。一些参考文献:

说“使用CMake!”的答案给你很好的建议,因为他们鼓励你使用一个构建系统来支持在所有这些系统上本地构建你的源代码,但如果你真的只能在Windows 7上构建,那么使用CMake对你没有任何好处。

答案 8 :(得分:0)

使用const,现在使用CLion IDE和WSL实际上很容易。在Windows 10主机上工作时,可以使用WSL安装使用Linux编译器工具链(通常为GCC)来编译代码。然后,您当然也可以切换到Windows之类的Windows工具链,或者将MinGWVisual Studio一起使用,以再次编译以获取MSVC二进制文件。

在一天结束时,这会给您两个二进制文件,而您好像一直都在使用Windows。有人说Windows是近年来WSL做的最好的事情之一。确实,跨平台Microsoft开发非常棒。

请注意,C/C++的编译不包括在内,因此,不幸的是,您仍然需要拥有OS X或运行Mac的虚拟机。