使用自动工具安装前缀 我用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
。我可以使用相对路径,但移动二进制文件会破坏图标,这显然是黑客行为。我认为应该有一种特殊的方式来处理图标与常规数据分开,因为人们可以安装第三方图标包。因此,我有两个问题:
add\u resource\u path()
(我仍然需要安装前缀),然后我可以使用库按名称获取图标
在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
的情况下构建,这是预期用途,也是完全正常的。