我正在使用gtkmm作为窗口库并使用自动工具作为构建系统来编写C ++程序。在我的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
。我可以使用相对路径,但是移动二进制文件会破坏图标,这似乎很容易受到黑客攻击。我认为应该应该一种特殊的方式来处理与一般数据分离的图标,因为人们可以安装第三方图标包。所以,我有两个问题:
编辑:gtkmm具有一个IconTheme类,这是在gtkmm中使用图标的标准方法。看来我add_resource_path()
(仍然需要安装前缀),然后可以使用该库按名称获取图标。
答案 0 :(得分:2)
答案 1 :(得分:2)
要将configure
确定的数据传送到源文件,可用的主要方法是将它们写入源#include
的标头中,或者在编译器命令行上将它们定义为宏。通过AC_DEFINE
Autoconf宏可以最方便地处理它们。在某些情况下,您可能还考虑将源文件转换为模板以供configure
处理,但是由于Autoconf本身使用该技术的内部版本来构建config.h
(在需要时),我通常不会推荐它。
但是,安装前缀和其他安装目录是特殊情况。直到您实际运行make
才最终设置它们。即使通过configure
的命令行选项进行设置,也可以通过在make
命令行上指定不同的值来覆盖它们。因此,出于特定的目的而依靠AC_DEFINE
是不安全的,实际上,这样做可能根本行不通( 对于prefix
本身是行不通的)。
相反,您应该在make
时评估的命令行选项中指定适当的宏定义。您可以通过在AM_CPPFLAGS
文件中设置Makefile.am
变量来对所有正在构建的目标执行此操作,如another answer所示。该特定示例将指定的符号设置为一个宏,该宏扩展为包含前缀的C字符串文字。或者,您可以考虑将整个图标目录定义为符号。如果只需要几个目标中的一个,那么您可能希望设置适当的onetarget_CPPFLAGS
变量。
请注意,$(prefix)/icons/hicolor/scalable/apps
是图标安装目录的非标准选择。通常可以解决类似/usr/local/icons/hicolor/scalable/apps
之类的问题。常规选择是$(datadir)/icons/hicolor/scalable/apps
,它将解决类似/usr/local/share/icons/hicolor/scalable/apps
的问题。