Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过config.h可移植地访问sysconfdir_C_Portability_Automake_System Configuration - Fatal编程技术网

通过config.h可移植地访问sysconfdir

通过config.h可移植地访问sysconfdir,c,portability,automake,system-configuration,C,Portability,Automake,System Configuration,我希望我的应用程序能够对在makeinstall(dist\u sysconf\u数据)期间安装的配置文件进行便携访问。可以通过config.h访问$(sysconfdir)吗?是的,但是根据官方的声音,您不应该这样做(就像,我现在不打算在手册中搜索它),以便继续支持为要构建的特定对象覆盖它 make CPPFLAGS="-USYSCONFDIR -DSYSCONFDIR=/blah" thisoneobject.o 因此,我们应该做的是: AM_CPPFLAGS = -DSYSCONFDIR

我希望我的应用程序能够对在
makeinstall
(dist\u sysconf\u数据)期间安装的配置文件进行便携访问。可以通过config.h访问
$(sysconfdir)
吗?

是的,但是根据官方的声音,您不应该这样做(就像,我现在不打算在手册中搜索它),以便继续支持为要构建的特定对象覆盖它

make CPPFLAGS="-USYSCONFDIR -DSYSCONFDIR=/blah" thisoneobject.o
因此,我们应该做的是:

AM_CPPFLAGS = -DSYSCONFDIR=\"${sysconfdir}\"

是的,但是你不应该根据官方的声音这样做(比如,我现在不打算在手册中搜索它),以便继续支持为要构建的特定对象覆盖它

make CPPFLAGS="-USYSCONFDIR -DSYSCONFDIR=/blah" thisoneobject.o
因此,我们应该做的是:

AM_CPPFLAGS = -DSYSCONFDIR=\"${sysconfdir}\"

我相信最常做的事(我就是这么做的)

Makefile.am中添加以下内容

AM\u CPPFLAGS=-DSYSCONFIR='“$(sysconfdir)””


现在您可以访问源代码中的
SYSCONFDIR
,我认为最常用的方法(我就是这么做的)

Makefile.am中添加以下内容

AM\u CPPFLAGS=-DSYSCONFIR='“$(sysconfdir)””


现在,如果您使用的是autoheader,那么您可以访问source中的
SYSCONFDIR
,将其添加到configure.ac将在config.h中输出一个SYSCONFDIR宏,它将使用值$(SYSCONFDIR)或${prefix}/等进行定义

if test "x$sysconfdir" = 'x${prefix}/etc'; then
    if test "x$prefix" = 'xNONE'; then
        sysconfdir=$ac_default_prefix/etc
    else
        sysconfdir=$prefix/etc
    fi
fi

AC_DEFINE_UNQUOTED([SYSCONFDIR], ["$sysconfdir"], [location of system configuration directory])

但我强烈建议不要这样做,而是坚持使用-DSYSCONFDIR标志。它的代码更少,因此更不容易出错。在configure.ac中使用我提到的条件可能不是可移植的,也不会考虑可能遇到的每种情况。使用-DSYSCONFDIR是最好的选择。有时外观并不重要。

如果使用autoheader,将其添加到configure.ac将在config.h中输出一个SYSCONFDIR宏,并使用值$(SYSCONFDIR)或${prefix}/等进行定义

if test "x$sysconfdir" = 'x${prefix}/etc'; then
    if test "x$prefix" = 'xNONE'; then
        sysconfdir=$ac_default_prefix/etc
    else
        sysconfdir=$prefix/etc
    fi
fi

AC_DEFINE_UNQUOTED([SYSCONFDIR], ["$sysconfdir"], [location of system configuration directory])

但我强烈建议不要这样做,而是坚持使用-DSYSCONFDIR标志。它的代码更少,因此更不容易出错。在configure.ac中使用我提到的条件可能不是可移植的,也不会考虑可能遇到的每种情况。使用-DSYSCONFDIR是最好的选择。有时,外观并不重要。

我可能不够清楚,我没有试图强制设置位置,只是可以访问安装时设置的内容。很像
PACKAGE\u VERSION
是通过config提供的。我想是这一部分:@JackKelly:No,它是autoconf.info第4.8.2节安装目录变量:“例如,不要试图在
configure
中评估
datadir
并使用
AC\u DEFINE\u UNQUOTED([datadir])在makefile中硬编码它[“$datadir”],[Data directory.])
,您应该添加
-DDATADIR='$(datadir)
”-D标志属于CPPFLAGS,而不是CFLAGSI可能不够清晰,我没有试图强制设置位置,只是可以访问安装时设置的内容。很像
PACKAGE\u VERSION
可以通过config获得。我想是这一部分:@JackKelly:不,这是autoconf.info第4.8.2节安装目录变量:“例如,不要尝试在
配置
中计算
datadir
,并在makefile中使用例如
acdefine\u UNQUOTED([datadir],“$datadir”],[Data directory.])
,而应该添加
-DDATADIR='$(datadir)
-D标志属于CPPFagas,而不是CFLAGS。”