【问题标题】:Packaging fonts and shaders with cmake使用 cmake 打包字体和着色器
【发布时间】:2018-06-25 11:31:48
【问题描述】:

我正在编写一个在 windows、OSX 和 linux 上运行的 OpenGL 应用程序。

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

我有一些我自己制作的glsl shaders,所以我的渲染是正确的。我也需要将这些与应用程序打包在一起

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

我有 C++ 代码,如果给定字体文件的路径,它将在渲染图像中为我提供正确的字体。同样,我有 OpenGL 代码,它需要在运行时知道着色器在哪里。

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

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

编译器标志?环境变量?目标财产?它们似乎都不太符合要求。或者那是错的?任何想法将不胜感激。

【问题讨论】:

  • 在 windows 上,如果字体和着色器集不是用户可补充的,我会简单地使用安装可执行文件的位置的相对路径。将可执行文件安装到“\Program Files (x86)\MyName\MyProgram\MyProgram.exe”,并将资源安装到 MyProgram\Resources(如果重要,可能具有区域设置意识)。然后使用“.\Resources\”作为路径
  • Linux 必须有一个等效于GetModuleFileName 的文件,它将返回您的可执行文件的路径,然后您可以使用它为您的资源构建路径名。 msdn.microsoft.com/en-us/library/windows/desktop/…
  • @RichardCritten:在 linux 上,可执行文件和它们使用的数据通常安装在完全不同的位置。
  • @RichardCritten: Nothing so easy, no.
  • 您不能使用相对路径约定并始终将它们放在可执行安装下的子目录中吗?

标签: c++ opengl fonts cmake glsl


【解决方案1】:

Linux 的安装理念完全不同。资源安装在标准位置,在二进制文件本身的固定相对位置(窗口在某种程度上与 Pr​​ogramData 和 .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 应用程序

【讨论】:

    【解决方案2】:

    你有两种可能:

    • 应用程序安装到用户选择的目录中,但您可以控制该目录中的所有内容(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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      相关资源
      最近更新 更多