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

我有一个使用C ++编写的项目(使用glibmm帮助),我使用自动工具来pipe理它。 我必须问的问题是:“我怎样才能从地球上find从哪里来的东西?”。 虽然我可以在autotools上find所有的指南,但是没有人回答这个问题。

例如,地图进入$DATADIR/maps (通常是/usr/[local/]share/myprogram/maps ,Autotools会把它们放在那里,但我怎么知道它是否放在那里,或$HOME/myprogram/maps并加载它们(理想情况下它会先search$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 

再次感谢乔纳森让我看看在哪里,但是我想为后人发表完整的答案。