我正在尝试将GNU AutoTools用于我的C ++项目。我编写了configure.ac,makefile.am等。我有一些程序在执行期间使用的文件,例如模板文件,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>?
..
答案 0 :(得分:4)
AC_DEFINE解决方案原则上很好,但需要进行类似shell的变量扩展。也就是说,_ABC_PATH_将扩展为“$ {bindir} /../ data / abs”,而不是/ data / abc。
一种方法是通过-D标志定义路径,该标志由make:
扩展myprogram_CPPFLAGS += -D_ABC_PATH='\"${abcdir}\"'
原则上工作正常,但你必须在myprogram的依赖项中包含config.status。
如果你有许多这样的替换变量,你应该推出一个paths.h文件 由automake生成的规则如下:
paths.h : $(srcdir)/paths.h.in config.status
sed -e 's:@ABC_PATH@:${abcdir}:' $< > $@
作为旁注,你知道$ {prefix}和$ {datarootdir}和朋友,不是吗?如果没有,更好地阅读它们;如果用户确实设置了$ {exec_prefix},则$ {bindir} / ..不一定等于$ {prefix}。