【发布时间】:2018-12-23 11:00:06
【问题描述】:
我正在编写一个 C++ 程序,使用 gtkmm 作为窗口库并使用 autotools 作为我的构建系统。在我的 Makefile.am 中,我按如下方式安装图标:
icondir = $(datadir)/icons/hicolor/scalable/apps
icon_DATA = $(top_srcdir)/appname.svg
编辑:从prefix更改为datadir
这会导致在安装程序时将appname.svg 复制到$(datadir)/icons/hicolor/scalable/apps。在我的 C++ 代码中,我想在运行时访问该图标以进行窗口装饰:
string iconPath = DATADIR + "/icons/hicolor/scalable/apps/appname.svg";
// do stuff with the icon
我不确定如何为此目的获得DATADIR。我可以使用相对路径,但是移动二进制文件会破坏图标,这似乎很明显。我认为应该有一种特殊的方式来处理与一般数据分开的图标,因为人们可以安装第 3 方图标包。所以,我有两个问题:
- 在 autotools/C++
/gtkmm中安装和使用图标的标准方法是什么?
编辑:gtkmm 有一个IconTheme 类,这是在gtkmm 中使用图标的标准方式。看来我add_resource_path()(还是需要安装前缀的),然后就可以使用库按名称获取图标了。
- 用autotools/C++访问autotools安装前缀的一般方法是什么?
【问题讨论】:
-
抱歉,因为
string iconPath = PREFIX + "/icons/hicolor/scalable/apps/appname.svg";不是C,并且没有“C/C++”语言,所以删除了C 引用。 -
按照你的设想做事我相信你需要从环境中读取
PREFIX和[可能]DESTDIR。PREFIX通常是相对的,例如../../share/...。我不确定您可以对 staging 和DESTDIR做些什么。也许布林格会有一个答案。他通常会回答我的重要问题。 -
我可以依靠环境变量来保持一致吗?主要问题是,如果我在 IDE 中手动编译或将其转换为 flatpak,则会有不同的前缀。现在我可以做的是编写一个构建钩子来修改我的代码并在其中编辑它,但这基本上是一个宏(或编译指示?指令?),我很难相信这样的事情还没有标准化。
-
你应该在 Makefile 中定义一个预处理器符号(例如 -DPREFIX=...),或者在 config.h 中写一些东西
-
安装图标的通常位置是
$(datadir)/icons/hicolor/scalable/apps。那将类似于/usr/local/share/icons/...。你确定这不是你真正想要的地方吗?
标签: c++ linux autotools autoconf gtkmm