我的程序需要在运行时加载一些文件,这些文件将被安装到./configure --datadir=/somewhere
由于我的程序需要知道此文件夹在运行时的位置,我需要在某处#define一个符号,以便C代码可以作为字符串访问路径。
我目前正在修改编译器标志:
AM_CPPFLAGS = -DDATA_PATH=\"$(pkgdatadir)\"
然而,由于配置脚本已经生成了一个包含其他内容的config.h文件,我希望在那里出现符号。
这可能吗?
答案 0 :(得分:6)
您的解决方案是正确的。 Autoconf / Automake不支持(轻松)支持将安装路径放入config.h
的原因是理论上你应该能够在构建时覆盖路径,如make prefix=/else/where
。这种可能性现在有些神秘,但这就是原因。 (请注意,这与[{1}}不同,尽管有make install prefix=/else/where/
,但它仍然有用。)
答案 1 :(得分:6)
您的回答是首选方式。 autoconf手册解释了如何在“make install”时覆盖各种变量(例如,这对包装非常有用)。这样做(在“安装目录变量”部分中):
A corollary is that you should not use these variables except in
makefiles. For instance, instead of trying to evaluate `datadir' in
`configure' and hard-coding it in makefiles using e.g.,
`AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])', you
should add `-DDATADIR='$(datadir)'' to your makefile's definition of
`CPPFLAGS' (`AM_CPPFLAGS' if you are also using Automake).
autotools和一般的构建系统是一个令人费解的事业,没有人能够提出一些很好的方法来做一般性的事情,这意味着我们必须阅读像这样的部分并完全解决。无论如何,你的直觉是正确的!
答案 2 :(得分:5)
AC_DEFINE_UNQUOTED([DATA_PATH], ["$pkgdatadir"])
虽然修改编译器标志实际上是更常用的方法。
答案 3 :(得分:1)
如果您的源代码必须知道一系列此类路径,并且您希望避免编译中的过多噪音(例如-DPATH1 = / path / to / something -DPATH2 = / path2 / to / something2 -DPATH3 = / path3 / to / something3 ... ad infinitum),对某些人来说可能需要的另一种选择是用行创建一个新的“mynewheader.h.in”
#define PATH1 "@PATH1@"
#define PATH2 "@PATH2@"
#define PATH3 "@PATH3@"
并将其添加到您的configure.ac的AC_CONFIG_FILES行,例如:
AC_CONFIG_FILES([Makefile mynewheader.h])