Как выяснить, откуда загружать данные программы? - PullRequest
2 голосов
/ 13 марта 2009

У меня есть проект, написанный на C ++ (с помощью glibmm), и я использую autotools для управления им. Вопрос, который я должен задать: «КАК НА ЗЕМЛЕ, ЧТОБЫ Я УЗНАЛ, ГДЕ ЗАГРУЗИТЬ ПЕРСОНАЛ?». Хотя я могу найти все нужные мне руководства по автоинструментам, никто не отвечает на этот вопрос.

Например, карты входят в $DATADIR/maps (обычно /usr/[local/]share/myprogram/maps. Autotools делает правильные вещи и помещает их туда, но как мне узнать, положил ли он их туда или $HOME/myprogram/maps и загрузить их соответствующим образом (в идеале это ' Сначала я буду искать $PWD, но это легко).

Ответы [ 2 ]

2 голосов
/ 18 марта 2009

Ответ Джонатана Леффлера был полезен (он предоставил мне достаточно информации, чтобы я смог получить эволюцию исходного кода и найти то, что мне нужно было сделать), но он не полностью ответил на мой вопрос, поэтому я выложу полное решение здесь:

В 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

Еще раз, спасибо Джонатану за то, что он показал мне, где искать, но я хотел опубликовать полный ответ для потомков.

2 голосов
/ 13 марта 2009

Вы можете встроить строки в свой исполняемый файл для различных автоматически настраиваемых расположений, в которых вы, возможно, захотите посмотреть. Это более или менее то, что делают такие программы, как 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

Комментарий гласит: «Это то, что я пытаюсь понять, как это сделать?»

Есть множество способов. Часть ответа - знать, какие имена вам нужны. Если вы посмотрите на вывод автоконфигурации, в make-файле есть такие имена, как prefixdir и pkglibdir. Вы можете добавить их в строки компилятора C:

DFLAG1 = -DPKGLIBDIR='"$(pkglibdir)"'

и добавьте DFLAG1 к своим CFLAGS. Повторите до тошноты ...

Код внутри вашей программы может выполнять следующие действия:

static const char *libdirs_to_search[] =
{
    ...
#ifdef PKGLIBDIR
    PKGLIBDIR,
#endif /* PKGLIBDIR */
};

Более чистый способ сделать это - изменить сгенерированный файл config.h и код конфигурации так, чтобы интересующие вас каталоги определялись в файле config.h, а не в make-файле.

...