使用 autotools 安装前缀

Use autotools installation prefix

我正在编写一个 C++ 程序,使用 gtkmm 作为 window 库,使用 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++ 代码中,我想在运行时访问图标以获得 window 装饰:

string iconPath = DATADIR + "/icons/hicolor/scalable/apps/appname.svg";
// do stuff with the icon

我不确定如何为此获得 DATADIR。我可以使用相对路径,但是移动二进制文件会破坏图标,这似乎很明显是黑客行为。我认为 应该 是一种特殊的方式来处理与一般数据分开的图标,因为人们可以安装第 3 方图标包。所以,我有两个问题:

  1. 在 autotools/C++/gtkmm 中安装 和使用 图标的标准方法是什么?

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

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

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

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

参见 autoconf 手册中的 Defining Directories

要将 configure 确定的数据传送到您的源文件,可用的主要方法是将它们写入您的源文件 #include 的 header 或将它们定义为宏编译器命令行。通过 AC_DEFINE Autoconf 宏可以最方便地处理这些问题。在某些情况下,您可能还会考虑将源文件转换为模板以供 configure 处理,但除非 Autoconf 本身使用该技术的内部版本来构建 config.h (当需要时),我通常不会推荐它。

但是,安装前缀和其他安装目录是特殊情况。直到您真正 运行 make 才最终设置它们。即使您通过 configure 的 command-line 选项设置它们,您仍然可以通过在 make 命令行上指定不同的值来覆盖它。因此,为了这个特定目的依赖 AC_DEFINE 是不安全的,事实上,这样做可能根本不起作用( 不会 prefix本身)。

相反,您应该在 command-line 选项中指定适当的宏定义,该选项在 make 时计算。您可以通过在 Makefile.am 文件中设置 AM_CPPFLAGS 变量来为所有正在构建的目标执行此操作,如 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.