【问题标题】:How to figure out where to load program data from?如何弄清楚从哪里加载程序数据?
【发布时间】:2023-03-10 22:40:02
【问题描述】:

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

例如,地图进入$DATADIR/maps(通常是/usr/[local/]share/myprogram/maps。Autotools 做了正确的事情并将它们放在那里,但我怎么知道它是放在那里还是 $HOME/myprogram/maps 并适当地加载它们(理想情况下) d 会先搜索$PWD,但这很简单)。

【问题讨论】:

    标签: c++ linux autotools


    【解决方案1】:

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

    【讨论】:

    • ...这就是我想弄清楚的方法。
    【解决方案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
    

    再次感谢乔纳森告诉我在哪里看,但我想为后代发布完整的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-27
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多