繁体   English   中英

如何弄清楚从何处加载程序数据?

[英]How to figure out where to load program data from?

我有一个用C ++编写的项目(在glibmm的帮助下),并且正在使用自动工具进行管理。 我要问的问题是“我如何确定从哪里装载东西?”。 虽然可以在自动工具上找到我想要的所有指南,但没有一个回答这个问题。

例如,地图放在$DATADIR/maps (通常是/usr/[local/]share/myprogram/maps maps。Autotools做正确的事并将其放置在其中,但是我怎么知道是将其放置在其中还是$HOME/myprogram/maps并适当地加载它们(最好先搜索$PWD ,但这很容易)。

您可以将字符串构建到可执行文件中,以查找可能需要查看的各种自动配置的位置。这或多或少是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

评论说:“这就是我要弄清楚怎么做?”

有很多方法。 答案的一部分是知道您需要哪些名称。 如果查看自动配置输出,则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中定义您感兴趣的目录。

乔纳森·莱弗勒(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)给我看了看哪里,但我想为后代提供完整的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM