在多个系统上使用CMake安装C++应用程序

问题描述 投票:0回答:1

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

c++ linux windows cmake compilation
1个回答
0
投票
  1. 二进制分发

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

这取决于2个方面:为了在另一个系统上运行预建的应用程序,该系统必须在SW和HW上都兼容,也就是说,这两个系统必须是 SW APIs 和(硬件架构例如,如果你在Linux上的任何一种PC上建立了应用程序,并使用了OpenGL和SDL2,以及Linux系统库,你的程序必须 "依赖于 "这些东西,才能运行。更具体地说,它依赖于OpenGL、SDL2和操作系统API的特定API版本,以及硬件(包括但不限于 CPU指令集).要制作一个可以在其他机器上运行的可移植应用,你需要定义一个分发机制(源码,或二进制),然后解决问题.你的问题的这一部分看起来更像是二进制分发.对于二进制分发,你需要将依赖关系与你的应用一起提供,或者直接(通过将它们包含在你的包中),或者间接,通过提供一个智能安装程序,将下载依赖关系并与你的应用一起安装。 开始解决这个问题的最简单的方法是静态地链接到你的主要依赖关系,如果你知道它们并不是在你的目标操作系统中开箱即用的。CPack 是你在使用CMake。

  1. 源码分布

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

如果你的意思是,是否有可能在另一台机器上重建你的应用程序,并在同一台机器上运行,答案是:这种方法将消除HW依赖,但仍然会留下所有的SW依赖,这种方法看起来像一个源代码分发.为了解决SW依赖问题,你必须,首先,在你的CMake文件中定义它们。CMake pkgconfig 或使用 原生CMake包装.一旦你完成了这些工作,CMake脚本将在一定程度上为你处理依赖关系。

  1. 跨平台开发

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

为了做到这一点,你需要在你的应用程序中定义一个操作系统的可移植性层,你不能直接使用Linux或Windows系统库,如果你能严格地保持自己在Windows支持的POSIX子集范围内,那么只需一点到中等程度的努力就可以做到这一点。否则,你将不得不定义你的可移植性API,并为你关心的所有平台实现它.一旦你解决了跨平台的部分,它就会归结为源码或二进制发布(本答案的第1和第2部分)。

© www.soinside.com 2019 - 2024. All rights reserved.