C++跨平台编译

Cha*_*kka 18 c++ cross-platform cross-compiling

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

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

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

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

有可能吗?

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

Ste*_*ser 30

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

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

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

只需在网上搜索有关交叉编译,工具链和持续集成的进一步阅读.

  • 我知道,操作系统/平台主题可能有些令人沮丧.交叉编译仅在嵌入式系统上完全开发,没有人会想到在目标上编译它. (3认同)
  • @gebbissimo,简单地说,Linux 开发人员比 Windows 开发人员更擅长制作 Linux 编译器。在机器层面,不同平台上不同操作系统与硬件的接口不同。这意味着 Linux C++ 编译器需要与 Windows C++ 编译器不同。现在,您可以编写一个在 Windows 平台上运行的 Linux 编译器,但是它获得的支持会比在 Linux 平台上运行的 Linux 编译器少。所做的假设是您无论如何都有用于软件测试的目标平台的副本(为什么要构建无法测试的应用程序?) (3认同)
  • 你怎么能确保它会在其他操作系统上运行?至少Linux是免费的,你可以在VM中运行它(例如VMWare Player也是免费的).对于OSX,你需要一份不是免费的副本...... (2认同)

aar*_*gon 11

你需要一个像自动工具或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
Run Code Online (Sandbox Code Playgroud)

CMake支持2.6版的交叉编译.阅读本文以深入了解此问题.祝好运.


mad*_*uci 7

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

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

#ifdef WIN32
//do some stuff for Windows
#elif __APPLE__
//do some stuff for Apple
#elif __linux__
//do stuff for Linux
#endif
Run Code Online (Sandbox Code Playgroud)

在此链接中,您可以找到所有预定义宏的列表.

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

GCC

  • @MSalters 在 Linux 中,如果您使用 OpenGL 应用程序,您可以发出 X11 特殊命令。在 Windows 上,Visual Studio 也有一些特定于编译器的命令。 (2认同)
  • @MSalters Qt 是题外话。当您不使用这些框架时,您应该逐个平台地调整代码平台。 (2认同)