我有一个用C ++编写的项目(使用glibmm帮助),我正在使用autotools来管理它。我不得不问的问题是“如何在地球上找出从哪里加载东西?”。虽然我可以在autotools上找到我想要的所有指南,但没有人回答这个问题。
例如,地图位于$DATADIR/maps
(通常为/usr/[local/]share/myprogram/maps
.Autotools会做正确的事情并将它们放在那里,但我怎么知道它是将它们放在那里还是$HOME/myprogram/maps
并加载它们是适当的(理想情况下它会首先搜索$PWD
,但这很容易)。
答案 0 :(得分:2)
您可以将字符串构建到可执行文件中,以用于您可能想要查看的各种自动配置位置。这或多或少是GCC之类的程序。
例如,我的机器上的GCC 4.3.3在/ work5 / tmp下编译并配置为在/usr/gcc/v4.3.3中安装,它包含(以及其他许多字符串)字符串:
/usr/ccs/bin/
/usr/ccs/lib/
/usr/gcc/v4.3.3
/usr/gcc/v4.3.3/bin/
/usr/gcc/v4.3.3/lib
/usr/gcc/v4.3.3/lib/gcc/
/usr/gcc/v4.3.3/libexec/gcc/
/usr/gcc/v4.3.3/share/locale
/usr/gnu/include
/usr/include
/usr/include/iso
/usr/include/sys
/usr/lib/
/usr/lib/ld.so.1
/usr/libexec/gcc/
/usr/local/share/bison
/usr/tmp
/var/tmp
/var/tmp/
/work5/tmp/gcc-4.3.3-obj/./prev-gcc/include
/work5/tmp/gcc-4.3.3-obj/gcc
/work5/tmp/gcc-4.3.3-obj/intl
/work5/tmp/gcc-4.3.3-obj/libiberty
/work5/tmp/gcc-4.3.3-obj/sparc-sun-solaris2.10/libgcc
评论说:“这就是我想弄明白怎么做的?”
有很多方法。部分答案是知道您需要哪些名称。如果查看autoconfigure输出,makefile中会有诸如prefixdir和pkglibdir之类的名称。您可以将它们添加到C编译器行:
DFLAG1 = -DPKGLIBDIR='"$(pkglibdir)"'
并将DFLAG1添加到您的CFLAGS中。重复广告恶心...
程序中的代码可以执行以下操作:
static const char *libdirs_to_search[] =
{
...
#ifdef PKGLIBDIR
PKGLIBDIR,
#endif /* PKGLIBDIR */
};
更简洁的方法是修改生成的config.h文件和配置代码,以便您感兴趣的目录在config.h文件中定义,而不是在makefile中定义。
答案 1 :(得分:2)
Jonathan Leffler的回答很有帮助(他为我提供了足够的信息来获取源代码进化并找到我需要做的事情),但它并没有完全回答我的问题,所以我将在这里发布完整的解决方案:
在configure.ac(或configure.in,无论如何)中,我在最后添加了以下行:
# Defines so we know where to look
privdatadir='${datadir}'/myprogram
AC_SUBST(privdatadir)
mapsdir='${privdatadir}'/maps
AC_SUBST(mapsdir)
在src / Makefile.am中,添加了以下内容:
AM_CXXFLAGS = -DMYPROGRAM_MAPSDIR=\"$(mapsdir)\"
在实际的C ++代码中,使用了以下内容:
const std::string file_directory (MYPROGRAM_MAPSDIR); // Defined in Makefile.am
再次感谢Jonathan向我展示了在哪里看,但我想为后人发布完整的答案。