使用自动工具安装前缀 我用GTKMM编写了一个C++程序,作为窗口库和AutoToobe作为我的构建系统。在my Makefile.am中,我按如下方式安装图标: icondir = $(datadir)/icons/hicolor/scalable/apps icon_DATA = $(top_srcdir)/appname.svg

使用自动工具安装前缀 我用GTKMM编写了一个C++程序,作为窗口库和AutoToobe作为我的构建系统。在my Makefile.am中,我按如下方式安装图标: icondir = $(datadir)/icons/hicolor/scalable/apps icon_DATA = $(top_srcdir)/appname.svg,c++,linux,autotools,autoconf,gtkmm,C++,Linux,Autotools,Autoconf,Gtkmm,编辑:从前缀更改为datadir 这导致安装程序时,appname.svg被复制到$(datadir)/icons/hicolor/scalable/apps。在我的C++代码中,我想在运行时访问窗口装饰图标: string iconPath = DATADIR + "/icons/hicolor/scalable/apps/appname.svg"; // do stuff with the icon 我不确定如何获取用于此目的的DATADIR。我可以使用相对路径,但移动二进制文件会破坏图标

编辑:从
前缀
更改为
datadir

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

string iconPath = DATADIR + "/icons/hicolor/scalable/apps/appname.svg";
// do stuff with the icon
我不确定如何获取用于此目的的
DATADIR
。我可以使用相对路径,但移动二进制文件会破坏图标,这显然是黑客行为。我认为应该有一种特殊的方式来处理图标与常规数据分开,因为人们可以安装第三方图标包。因此,我有两个问题:

  • 使用autotools/C++/gtkmm安装和使用图标的标准方式是什么
  • 编辑:gtkmm有一个类,它是在gtkmm中使用图标的标准方式。看起来我
    add\u resource\u path()
    (我仍然需要安装前缀),然后我可以使用库按名称获取图标

  • 使用autotools/C++访问autotools安装前缀的一般方法是什么

  • 在Makefile.am中,使用以下命令

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

    请参见autoconf手册中的。

    要将
    配置所确定的数据传送到源文件,可用的主要方法是将它们写入源文件
    包含的头文件中,或在编译器命令行上将它们定义为宏。通过
    AC_DEFINE
    Autoconf宏可以最方便地处理这些问题。在某些情况下,您也可以考虑将源文件转换为<代码>配置> /COD>的模板,但除了AutoCONF本身使用该技术的内部版本来生成<代码> CONFIG.H./C>(当请求时),我通常不会推荐它。 但是,安装前缀和其他安装目录是特殊情况。在实际运行
    make
    之前,不会最终设置它们。即使您通过
    configure
    的命令行选项设置它们,您仍然可以通过在
    make
    命令行上指定不同的值来覆盖它们。因此,依赖
    AC_DEFINE
    来实现此特定目的是不安全的,事实上,这样做可能根本不起作用(对于
    前缀本身不起作用)

    相反,您应该在命令行选项中指定适当的宏定义,该选项在
    make
    时间进行计算。通过在
    Makefile.AM
    文件中设置
    AM\u CPPFLAGS
    变量,可以对正在生成的所有目标执行此操作,如中所示。该特定示例将指定的符号设置为宏,该宏扩展为包含前缀的C字符串文字。或者,您可以考虑将整个图标目录定义为符号。如果您只需要为多个目标中的一个目标使用它,那么您可能更喜欢设置适当的
    onetarget\u CPPFLAGS
    变量


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

    对不起,编辑掉C引用,因为
    字符串iconPath=PREFIX+“/icons/hicolor/scalable/apps/appname.svg”
    不是C,也没有“C/C++”语言。要按照您设想的方式做事,我相信您需要从环境中读取
    前缀
    和[可能]
    DESTDIR
    <代码>前缀
    通常是相对的,类似于
    。/../share/..
    。我不确定您可以对登台和
    DESTDIR
    做些什么。也许布林格会有答案。他通常会回答我的非琐碎问题。我能依靠环境变量保持一致吗?主要问题是,如果我在IDE中手动编译,或者将其转换为flatpak,那么前缀就不同了。现在我可以做的是编写一个构建钩子来修改代码并在其中进行编辑,但这基本上是一个宏(或者一个pragma?指令?),我发现很难相信这样的事情还没有标准化。您应该在Makefile中定义一个预处理器符号(例如-DPREFIX=…),或者在config.ht中编写一些东西安装图标的通常位置是
    $(datadir)/icons/hicolor/scalable/apps
    。这类似于
    /usr/local/share/icons/…
    。你确定那不是你真正想放的地方吗?为了完整性,把这个标记为正确的。感谢您指出
    前缀
    数据目录
    之间的区别;最后,我将
    CPPFLAGS=-DDATADIR='“$(datadir)”@CPPFLAGS
    添加到我的
    Makefile.am
    中,并在我的代码中将其引用为
    datadir
    。最好使用
    am\u CPPFLAGS
    your program\u CPPFLAGS
    。构建程序的人员为构建而运行
    make CPPFLAGS=-Dfoo=bar
    ,这将覆盖
    CPPFLAGS
    定义,从而在未定义
    DATADIR
    的情况下构建,这是预期用途,也是完全正常的。