【问题标题】:C++ cross platform compilingC++跨平台编译
【发布时间】:2014-09-28 22:55:32
【问题描述】:

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

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

我想在我的操作系统中针对以下操作系统进行编译。

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

有没有可能?

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

【问题讨论】:

  • 查看this Linux 问题。
  • 您必须在每个操作系统上以任何方式对其进行测试。你不能指望它可以在每个操作系统上运行。
  • 除非你能在 OS X 上测试你的代码,否则在 OS X 上交叉编译是没有意义的。对于 Linux,下载 VirtualBox 是最简单的。
  • 看看CMake 也是一个构建系统。

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


【解决方案1】:

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

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

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

只需在网上搜索有关交叉编译、工具链和持续集成的更多阅读材料。

【讨论】:

  • 我想为所有 Oses 编译 C++。只有 Win7 32 位。
  • 您如何确保它可以在其他操作系统上运行?至少 Linux 是免费的,您可以在 VM 中运行它(例如 VMWare Player 也是免费的)。对于 OSX,您需要一份副本,这不是免费的……
  • 我知道,操作系统/平台主题可能有些令人沮丧。交叉编译仅在嵌入式系统上完全开发,没有人会想到在目标上编译它。
  • “在目标操作系统上编译比交叉编译要容易得多” - 为什么?我不是在质疑那句话的真实性,只是在询问更多细节。
  • @gebbissimo,简单地说,linux 开发人员比 windows 开发人员更擅长制作 linux 编译器。在机器层面,不同的操作系统在不同的平台上与硬件的接口是不同的。这意味着 linux C++ 编译器需要不同于 Windows C++ 编译器。现在,您可以编写一个在 windows 平台上运行的 linux 编译器,但是它得到的支持比在 linux 平台上运行的 linux 编译器要少。所做的假设是无论如何您都有一个用于软件测试的目标平台的副本(为什么要构建一个您无法测试的应用程序?)
【解决方案2】:

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

归根结底,这会为您提供两个二进制文件,而感觉就像您一直只使用Windows。有人说WSLMicrosoft 近年来所做的最好的事情之一。确实,它非常适合跨平台 C/C++ 开发。

请注意,这里不包括为OS X 编译,因此很遗憾,您仍然需要有一个Mac 或运行OS X 的虚拟机。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我不是想直接回答作者的问题,而是提示作者(和其他有相同问题的人)考虑什么可能是更好的选择。在这里务实有什么问题?
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

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

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

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

      GCC

      【讨论】:

      • 为什么需要在代码中进行预处理检查?我有一个真正的应用程序,只是不在乎。从标准库开始,所有与平台相关的东西都对我隐藏在现有库中。
      • @MSalters 每个平台都有自己的案例,尤其是在处理 GUI 应用程序或特殊系统调用时。这取决于您要部署的代码。
      • 通常最好使用 Qt 之类的库来处理 GUI 平台依赖关系。
      • @MSalters 在 Linux 中,如果您使用 OpenGL 应用程序,您可以发出 X11 特殊命令。在 Windows 上,Visual Studio 也有一些特定于编译器的命令。
      • @MSalters Qt 离题了。当你不使用这些框架时,你应该按平台调整代码。
      【解决方案6】:

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

      你也可以试试SCons,它的知名度有点低,但简单一点

      【讨论】:

        【解决方案7】:

        我认为简短的回答是肯定的,但是我们有细节(魔鬼总是隐藏在细节中)。简单来说,我们有两个问题:源代码兼容性和工具链兼容性。

        1. 工具链兼容性。这里我们需要考虑 3 个部分:编译器、库和构建工具。幸运的是,构建工具存在,甚至没有。它在所有轮回、cmake、ninja 等中都是著名的。我更喜欢 cmake 作为最简单的工具,但你总是可以拿起你选择的武器。编译器。 GCC 是不错的选择,但今天我们有 CLang,这也是不错的选择。我敢打赌 CLang 是更有趣的解决方案,它在 Windows 上更干净且得到更好的支持。另一个不错的选择是 Intel C++/C,但它的成本很高。另一种方法是为不同的系统使用不同的编译器,这也是不错的选择。 Boost 做到了,Boost 团队是最好的团队之一。您可以深入研究 boost 配置并获得许多有趣的宏和标头。 C++ 标准库和其他库。这是最棘手的事情之一。 C++ 有点标准,但更新后可能会出现问题。其他库应该使用您用于特定系统的编译器构建。因此,请准备好使用库包分发您的软件。另一个不错的选择是依赖第三方跨平台库,例如 Qt 或 WxWidgets。

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

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

            【解决方案9】:

            您需要像自动工具或 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 以深入了解此问题。 祝你好运。

            【讨论】:

              猜你喜欢
              • 2014-04-07
              • 2013-04-08
              • 2011-05-23
              • 2015-06-10
              • 1970-01-01
              • 2012-04-05
              • 1970-01-01
              • 1970-01-01
              • 2011-04-14
              相关资源
              最近更新 更多