使用cmake打包字体和着色器

时间:2018-01-16 17:21:21

标签: c++ opengl fonts cmake glsl

我正在编写一个在Windows,OSX和Linux上运行的OpenGL应用程序。

我有一些free-for-commercial-use truetype fonts我在应用程序中打包,因此用户可以为我的渲染文本部分选择他们喜欢的字体。

我自己制作了一些glsl shaders,这样我的渲染才能做到正确。我也需要用app打包这些

我使用cmake构建并使用cpack构建安装程序。我使用the install command来控制字体和着色器在目标计算机上的位置。

我有C ++代码,给定一个字体文件的路径,它会在渲染图像中给我正确的字体。同样,我有OpenGL代码,需要在运行时知道着色器的位置。

在构建机器上,我使用configure_file来处理操作系统/用户变体。字体和着色器是相对于代码所在的目录,因此我可以将它们的位置作为命名空间变量放入头文件中,并且着色和字体代码始终可以找到它们。

现在我试图让已安装的应用程序正常运行我遇到了问题:我可以在安装时将我的字体和着色器放在目标计算机上的任何位置,但我很难看到如何在目标机器上运行(安装)可执行文件以了解该位置的位置。

编译器标志?环境变量?目标财产?他们似乎都不太合适。或者那是错的?任何想法都会非常感激。

2 个答案:

答案 0 :(得分:3)

这里有两种可能性:

  • 应用程序安装在用户选择的目录中,但您可以控制该目录中的所有内容(CMake称之为安装树)。因此,您知道所有外部文件相对于可执行文件的位置,因此您可以使用相对路径来解决它们(也是suggested in the comments)。这种方法在OS X和Windows中非常常见,其中每个应用程序通常安装在其自己的不同目录中。它对于Unix-y系统来说有点不太常见,因为通常只会将内容转储到/usr/bin
  • 如果您对相对路径不满意,可以始终将所有资源打包到可执行文件本身。这通常使用资源编译器完成,但CMake has built-in support用于那些。这种方法特别受GUI应用程序的欢迎,后者将其字体和图标打包到可执行文件本身。 Qt offers a cross-platform resource compiler就此而言,也是supported by CMake

答案 1 :(得分:1)

Linux有一个非常不同的安装理念。资源安装在标准位置,这些位置位于二进制本身的固定相对位置(窗口在这个方向上与ProgramData和.AppData有些相似)

Linux的方法是使用fontconfig来定位字体,然后在/ usr / share / fonts / myapp或用户目录(〜/ .fonts / myapp甚至更好的新XDG)中在系统范围内安装字体位置)

对于着色器,它与系统范围内的/ usr / share / myapp和用户端的XDG位置类似(https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html

当然你可以在你的代码中强制你想要的任何东西,并安装在/ opt中,它永远不会像用户POW那样是一个集成的linux应用程序