【问题标题】:install C++ application using CMake on multiple systems在多个系统上使用 CMake 安装 C++ 应用程序
【发布时间】:2020-08-25 06:54:12
【问题描述】:

我使用 C++ 和 SDL2 编写了一个简单的 openGL 应用程序。我已经在 linux 上使用 CMake 对其进行了编译,一切正常。我现在如何在其他系统上运行我的程序?是否可以在我的 linux 机器上编译程序,然后在另一台 linux 机器上打开编译后的输出文件?还是每台机器都必须编译自己的程序版本?我在 CMake 文件中链接的 SDL2 和 Freetype 库怎么样?我假设编译我的程序的每个系统都需要安装这些库?如果我想在 Windows 上运行我的应用程序怎么办?如果每个系统都需要编译自己的版本,有没有使用 CMake 文件创建安装程序的简单方法?

【问题讨论】:

  • “还是每台机器都必须编译自己的程序版本?” - 显然不是,而且您已经知道这一点。回想一下您是如何掌握操作系统的。它是否涉及从源代码编译它?如果是这样,您是如何获得编译器的?

标签: c++ linux windows cmake compilation


【解决方案1】:
  1. 二进制分布

    我现在如何在其他系统上运行我的程序?

这取决于两件事: 为了在另一个系统上运行预构建的应用程序,该其他系统必须在软件和硬件上都兼容;意思是,SW APIs 和 (HW architecture) 都必须“足够接近”。 例如,如果您在 Linux 上的任何类型的 PC 上构建应用程序,并使用 OpenGL 和 SDL2, 以及 Linux 系统库,您编程“依赖于”这些东西中的每一个,以便运行。更具体地说,它取决于 OpenGL、SDL2 和 OS API 的特定 API 版本以及硬件(包括但不限于CPU Instruction set)。 要制作可以在其他机器上运行的可移植应用程序,您需要定义分发机制(源代码或二进制文件),然后解决问题。 您问题的这一部分看起来更像是二进制分布。 对于二进制分发,您需要直接(通过将它们包含在您的包中)或间接地通过提供将下载依赖项并将它们与您的应用程序一起安装的智能安装程序来为您的应用程序提供依赖项。 开始解决这个问题的最简单方法是静态链接到您的主要依赖项,如果您知道它们不是与您的目标操作系统一起开箱即用的。 一般来说,如果您想采用这种方式,请考虑从您的应用程序中构建一个包。 如果您正在使用 CMake,请考虑使用 CPack

  1. 源分布

    是否可以在我的 Linux 机器上编译程序,然后在另一台 Linux 机器上打开编译后的输出文件? 还是每台机器都必须编译自己的程序版本?我在 CMake 文件中链接的 SDL2 和 Freetype 库怎么样? ?我假设编译我的程序的每个系统都需要安装这些库?

如果您的意思是,是否可以在另一台机器上重新构建您的应用程序并在同一台机器上运行它,答案是:这种方法将消除硬件依赖,但仍会保留所有软件依赖。 这种方法看起来像一个源代码分发。 要解决 SW 依赖问题,您必须首先在 CMake 文件中定义它们。 这里的一些可能性是使用CMake pkgconfig 或使用native CMake Packaging。 完成此操作后,CMake 脚本将在某种程度上为您处理依赖项。

  1. 跨平台开发

    如果我想在 Windows 上运行我的应用程序怎么办?如果每个系统都需要编译自己的版本,有没有使用 cmake 文件创建安装程序的简单方法?

为此,您需要在应用中定义操作系统可移植性层。 您不能直接使用 Linux 或 Windows 系统库。 如果您可以将自己严格控制在 Windows 支持的 POSIX 子集中,那么只需稍加努力即可做到这一点。否则,您必须定义可移植性 API,并为您关心的所有平台实现它。 一旦解决了跨平台部分,它就归结为源代码或二进制分发(此答案的第 1 部分和第 2 部分)。

【讨论】:

  • 非常感谢您提供清晰完整的答案。
猜你喜欢
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多