使用自动工具安装前缀

Use autotools installation prefix

本文关键字:安装 前缀 工具      更新时间:2023-10-16

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

  1. 安装并将图标与autotools/C++/gtkmm

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

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

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

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

相反,您应该在make时间评估的命令行选项中指定适当的宏定义。您可以通过在Makefile.am文件中设置AM_CPPFLAGS变量来为正在构建的所有目标执行此操作,如另一个答案所示。该特定示例将指定的符号设置为一个宏,该宏扩展为包含前缀的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的内容。

在Makefile.am中,使用以下

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

请参阅autoconf手册中的定义目录。