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



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

  1. 二进制分布

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

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

  1. 源分布

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

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

  1. 跨平台开发

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

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

最新更新