使用自动工具安装前缀

时间:2018-07-15 22:17:37

标签: c++ linux autotools autoconf gtkmm

我正在使用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。我可以使用相对路径,但是移动二进制文件会破坏图标,这似乎很容易受到黑客攻击。我认为应该应该一种特殊的方式来处理与一般数据分离的图标,因为人们可以安装第三方图标包。所以,我有两个问题:

  1. 使用自动工具/ C ++ / gtkmm 安装并使用图标的标准方法是什么?

编辑:gtkmm具有一个IconTheme类,这是在gtkmm中使用图标的标准方法。看来我add_resource_path()(仍然需要安装前缀),然后可以使用该库按名称获取图标。

  1. 使用autotools / C ++访问autotools安装前缀的一般方法是什么?

2 个答案:

答案 0 :(得分:2)

在您的Makefile.am中,使用以下内容

AM_CPPFLAGS = -DPREFIX='"$(prefix)"'

请参见autoconf手册中的Defining Directories

答案 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的问题。