c – 使用autotools安装前缀

我正在编写一个C程序,使用gtkmm作为窗口库,autotools作为我的构建系统.在我的Makefile.am中,我按如下方式安装图标:

icondir = $(datadir)/icons/hicolor/scalable/apps
icon_DATA = $(top_srcdir)/appname.svg

编辑:从前缀更改为datadir

这导致appname.svg在安装程序时被复制到$(datadir)/ icons / hicolor / scalable / apps.在我的C代码中,我想在运行时访问该图标以进行窗口装饰:

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

我不确定如何为此目的获得DATADIR.我可以使用相对路径,但随后移动二进制文件会破坏图标,这似乎是hackery的显而易见.我认为应该有一种特殊的方法来处理与一般数据分开的图标,因为人们可以安装第三方图标包.所以,我有两个问题:

>使用autotools / C / gtkmm安装和使用图标的标准方法是什么?

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

> autotools / C访问autotools安装前缀的一般方法是什么?

解决方法:

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

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

相反,您应该在生成时计算的命令行选项中指定适当的宏定义.您可以通过在Makefile.am文件中设置AM_CPPFLAGS变量为所有正在构建的目标执行此操作,如another answer所示.该特定示例将指定的符号设置为扩展为包含前缀的C字符串文字的宏.或者,您可以考虑将整个图标目录定义为符号.如果只需要一个目标中的一个目标,那么您可能更喜欢设置适当的onetarget_CPPFLAGS变量.

另外,请注意$(前缀)/ icons / hicolor / scalable / apps是图标安装目录的非标准选择.这通常会解决为/usr/local/icons / hicolor / scalable / apps之类的问题.传统的选择是$(datadir)/ icons / hicolor / scalable / apps,这将解析为/usr/local/share / icons / hicolor / scalable / apps.

上一篇:无需安装即可构建嵌套的Autotools软件包


下一篇:实现进制转化伪代码