使用 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 方图标包。所以,我有两个问题:
- 在 autotools/C++
/gtkmm 中安装 和使用 图标的标准方法是什么?
编辑:gtkmm 有一个 IconTheme class,这是在 gtkmm 中使用图标的标准方式。看来我add_resource_path()
(为此我还需要安装前缀),然后我可以使用库按名称获取图标。
- 用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
.
我正在编写一个 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 方图标包。所以,我有两个问题:
- 在 autotools/C++
/gtkmm中安装和使用图标的标准方法是什么?
编辑:gtkmm 有一个 IconTheme class,这是在 gtkmm 中使用图标的标准方式。看来我add_resource_path()
(为此我还需要安装前缀),然后我可以使用库按名称获取图标。
- 用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
.