Question

J'ai un projet écrit en C ++ (avec l'aide de glibmm) et j'utilise autotools pour le gérer. La question que je dois poser est la suivante: "COMMENT SUR LA TERRE PUIS-JE DÉTERMINER D'O CHARGER UN PRODUIT?". Bien que je puisse trouver tous les guides que je veux sur autotools, aucun d’entre eux ne répond à cette question.

Par exemple, les cartes vont dans $ DATADIR / maps (généralement / usr / [local /] share / mon programme / maps . Autotools agit correctement et les met en place. comment puis-je savoir s’il les met là ou si $ HOME / mon programme / maps et les charge de manière appropriée (idéalement, ce serait une recherche dans $ PWD en premier, mais facile).

Était-ce utile?

La solution 2

La réponse de Jonathan Leffler a été utile (il a fourni suffisamment d’informations pour que je puisse apt-obtenir l’évolution des sources et trouver ce que je devais faire), mais cela ne répondait pas tout à fait à ma question, je vais donc publier la solution complète ici:

Dans configure.ac (ou configure.in, peu importe), j'ai ajouté les lignes suivantes à la fin:

# Defines so we know where to look
privdatadir='${datadir}'/myprogram
AC_SUBST(privdatadir)

mapsdir='${privdatadir}'/maps
AC_SUBST(mapsdir)

Dans src / Makefile.am, le texte suivant a été ajouté:

AM_CXXFLAGS = -DMYPROGRAM_MAPSDIR=\"$(mapsdir)\"

Dans le code C ++ actuel, les éléments suivants ont été utilisés:

const std::string file_directory (MYPROGRAM_MAPSDIR); // Defined in Makefile.am

Encore une fois, merci Jonathan de m'avoir montré où chercher, mais je voulais poster la réponse complète pour la postérité.

Autres conseils

Vous pouvez créer les chaînes de caractères dans votre exécutable pour les différents emplacements autoconfigurés que vous voudrez peut-être regarder. C’est plus ou moins ce que font des programmes tels que GCC.

Par exemple, GCC 4.3.3 sur ma machine a été compilé sous / work5 / tmp et configuré pour être installé dans /usr/gcc/v4.3.3 et contient (parmi beaucoup d'autres) les chaînes:

/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

Un commentaire indique: "C’est ce que j’essaie de comprendre. Comment faire?"

Il existe de nombreuses manières. Une partie de la réponse consiste à savoir de quels noms vous avez besoin. Si vous regardez la sortie autoconfigure, il y a des noms tels que prefixdir et pkglibdir dans le fichier makefile. Vous pouvez les ajouter aux lignes du compilateur C:

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

et ajoutez DFLAG1 à vos CFLAGS. Répétez ad nauseam ...

Le code dans votre programme peut alors faire des choses comme:

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

Une méthode plus simple consiste à modifier le fichier config.h généré et le code de configuration de sorte que les répertoires qui vous intéressent soient définis dans le fichier config.h plutôt que dans le fichier Make.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top