Nat*_*nce 5 c++ linux autoconf autotools gtkmm
我正在编写一个 C++ 程序,使用 gtkmm 作为窗口库,使用 autotools 作为我的构建系统。在我的 Makefile.am 中,我按如下方式安装图标:
icondir = $(datadir)/icons/hicolor/scalable/apps
icon_DATA = $(top_srcdir)/appname.svg
Run Code Online (Sandbox Code Playgroud)
编辑:更改prefix
为datadir
这导致在安装程序时appname.svg
被复制到$(datadir)/icons/hicolor/scalable/apps
。在我的 C++ 代码中,我想在运行时访问图标以进行窗口装饰:
string iconPath = DATADIR + "/icons/hicolor/scalable/apps/appname.svg";
// do stuff with the icon
Run Code Online (Sandbox Code Playgroud)
我不确定如何DATADIR
为此目的获得。我可以使用相对路径,但是移动二进制文件会破坏图标,这似乎很明显。我认为应该有一种特殊的方式来处理与一般数据分开的图标,因为人们可以安装 3rd 方图标包。所以,我有两个问题:
编辑:gtkmm 有一个IconTheme类,它是在 gtkmm 中使用图标的标准方法。看来我add_resource_path()
(为此我仍然需要安装前缀),然后我可以使用库按名称获取图标。
要将由源文件确定的数据传送configure
到源文件,可用的主要方法是将它们写入源文件的标头中#include
,或者在编译器命令行上将它们定义为宏。通过 Autoconf 宏可以最方便地处理这些问题AC_DEFINE
。在某些情况下,您可能还会考虑将源文件转换为模板进行configure
处理,但除非 Autoconf 本身使用该技术的内部版本来构建config.h
(当需要时),我通常不会推荐它。
但是,安装前缀和其他安装目录是特殊情况。直到您实际运行时它们才最终设置make
。即使您通过configure
的命令行选项设置它们,您仍然可以通过在make
命令行上指定不同的值来覆盖它们。因此,依赖于此特定目的是不安全的AC_DEFINE
,事实上,这样做可能根本不起作用(对其本身不起作用prefix
)。
相反,您应该在实时评估的命令行选项中指定适当的宏定义make
。您可以通过AM_CPPFLAGS
在Makefile.am
文件中设置变量来对正在构建的所有目标执行此操作,如另一个答案中所示。该特定示例将指定符号设置为扩展为包含前缀的 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
。