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



我正在尝试在我的c++项目中使用GNU AutoTools。我写了configure。ac, makefile。我等等。我有一些文件是由程序在执行期间使用,如模板文件,XML模式等。因此,我沿着可执行文件安装/复制这些文件,对于可执行文件,我使用如下命令:

abcdir = $(bindir)/../data/abc/
abc_DATA = ../data/knowledge/abc.cc

现在它正确地复制了文件,我的程序安装结构看起来如下:

<installation_dir>/bin/<executableFile>
<installation_dir>/data/abc/abc.cc

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

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

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

一种方法是通过-D标志定义路径,该标志可以通过make: 展开
myprogram_CPPFLAGS += -D_ABC_PATH='"${abcdir}"'

,它在原则上工作得很好,但你必须使include配置。myprogram的依赖项状态。

如果您有许多这样的替代变量,您应该推出一个path .h文件,它是由automake生成,规则如下:

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

作为旁注,你知道${prefix}和${datarootdir}和朋友,不是吗?如果没有,最好仔细阅读;$ {bindir}/. .如果用户设置了${exec_prefix},则不一定等于${prefix}。

相关内容

最新更新