使用 GNU AutoTools 设置和使用数据目录路径

usm*_*man 3 c++ automake autoconf gnu autotools

我正在尝试将 GNU AutoTools 用于我的 C++ 项目。我编写了configure.ac、makefile.am等。我有一些程序在执行过程中使用的文件,例如模板文件、XML模式等。因此,我沿着可执行文件安装/复制这些文件,为此我使用类似的文件:

abcdir = $(bindir)/../data/abc/
abc_DATA = ../data/knowledge/abc.cc
Run Code Online (Sandbox Code Playgroud)

现在它正确复制了文件,我的程序安装结构如下所示:

<installation_dir>/bin/<executableFile>
<installation_dir>/data/abc/abc.cc
Run Code Online (Sandbox Code Playgroud)

现在的问题是,在源代码中我实际上使用了这些文件(abc.cc 等),为此我需要这些文件所在的路径来打开它们。一种解决方案是定义(使用 AC_DEFINE)一些变量,例如 _ABC_PATH_ ,它指向安装路径,但究竟如何做到这一点?或者有没有更好的方法可以做到这一点。例如,在源代码中,我做了类似的事情:

...
ifstream input(<path-to-abc-folder> + "abc.cc"); // how to find <path-to-abc-folder>?
..
Run Code Online (Sandbox Code Playgroud)

thi*_*ton 5

AC_DEFINE 解决方案原则上很好,但需要进行类似 shell 的变量扩展。也就是说,_ABC_PATH_ 将扩展为“${bindir}/../data/abs”,而不是/data/abc。

一种方法是通过 -D 标志定义路径,该标志由 make 扩展:

myprogram_CPPFLAGS += -D_ABC_PATH='\"${abcdir}\"'
Run Code Online (Sandbox Code Playgroud)

原则上工作正常,但你必须在 myprogram 的依赖项中包含 config.status 。

如果您有许多此类替换变量,则应该推出由 automake 生成的 paths.h 文件,其规则如下:

paths.h : $(srcdir)/paths.h.in config.status
     sed -e 's:@ABC_PATH@:${abcdir}:' $< > $@
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您确实了解 ${prefix} 和 ${datarootdir} 以及朋友,不是吗?如果没有,最好阅读它们;如果用户确实设置了 ${exec_prefix},则 ${bindir}/.. 不一定等于 ${prefix}。

  • AC_DEFINE_UNQUOTED 的工作方式与 AC_DEFINE 类似,但扩展了其参数 **EXACTLY ONCE**。因此,它通常适用于 ${prefix} 扩展,但通常不适合将路径插入到无法处理 shell 扩展的任何源中。 (2认同)