Comment est-ce que je spécifie dans un manuscrit de Makefile.am que je veux seulement compiler les fichiers d'objet .o qui peuvent être liés plus tard?
J'ai un Makefile.suis qui sera responsable de la construction d'une application finale binaire:
projet/src/Makefile.suis
également dans le répertoire src est un sous-répertoire appelé ctrnn qui contient un autre fichier Makefile.am:
projet/src/ctrnn/Makefile.suis
Maintenant, ctrnn/Makefile.suis ne devrait générer de l'objet .o fichiers avec l'idée étant que le haut-niveau Makefile.suis doit utiliser les fichiers objets générés dans le sous-répertoire ctrnn pour construire les binaires.
C'est le ctrnn/Makefile.suis
SOURCES = network.cpp\
neuron.cpp
AM_CPPFLAGS= @CXXFLAGS@
Basé sur ce Makefile.suis fichier, j'ai envie de finir avec le réseau.o et le neurone.o. Je suis de la génération de la fonction Makefile à l'aide de automake etc, mais quand je l'ai essayer et puis exécutez le fichier de créer, il ne fait rien et dit tout simplement:
faire: Rien à faire pour "all"
Je sais pourquoi, j'ai besoin de spécifier la cible de génération. Mais comment puis-je le faire dans le ctrnn/Makefile.suis de script étant donné que je ne veux pas créer un fichier binaire qui nécessiterait bin_PROGRAMS mais l'objet réel de fichiers réseau.o et le neurone.o?
(Remarque si je ne spécifiez un bin_PROGRAMS nom, c'est à juste titre finit par se plaindre d'une référence non définie à main).
Quoi suis-je fait de mal?
Grâce,
Ben.
source d'informationauteur Ben J
Vous devez vous connecter pour publier un commentaire.
Automake ne peut pas construire des objets sans une cible explicite (programme, bibliothèque) qui vont utiliser ces objets. Une des raisons est que les options de compilation sont spécifiés pour chaque cible. Si deux cibles, par exemple, deux binaires utiliser le même objet, mais ont différentes option de compilation, le même objet peut être compilé deux fois.
Vous avez trois façons de faire ce que vous voulez, elles impliquent toutes lacer vos fichiers source vers une cible.
Ne pas utiliser un
src/ctrnn/Makefile.am
il suffit de faire référence à la sous-répertoire source des fichiers à partir de votresrc/Makefile.am
:Notez que ce sera de construire
network.o
etneuron.o
dans le même répertoire quemain.o
. Si vous voulez des objets dans des sous-répertoires, utilisezAUTOMAKE_OPTIONS = subdir-objects
.Utiliser une commodité de la bibliothèque. Dans
src/crtnn/Makefile.am
faire une bibliothèque de vos deux objets:et dans
src/Makefile.am
, lien votre exécutable à la bibliothèque:Il est appelé "commodité" quand ça ne va pas être installé (vous pouvez dire à cause de la
noinst_
préfixe): il est utilisé lors de la compilation. Et c'est une bibliothèque statique, de sorte que le résultat est le même que si vous aviez remplacécrtnn/libcrtnn.a
parcrtnn/network.o
etcrtn/neuro.o
lors de la liaisonfoo
.Utiliser un Libtool la commodité de la bibliothèque. Ce qui nécessite plus de l'installation si vous n'êtes pas à l'aide de Libtool déjà. Vous devez ajouter un appel
LT_INIT
dansconfigure.ac
et exécutez à nouveauautoreconf
pour installer le libtool fichiers. Ensuite, vous pouvez mettre à joursrc/crtnn/Makefile.am
pour faire une bibliothèque de vos deux objets de la façon suivante:et
src/Makefile.am
comme suit:Quelle est la différence? vous pouvez demander, presque aucun. Un avantage de l'utilisation de Libtool commodité des bibliothèques, c'est qu'ils peuvent être imbriquées: une Libtool bibliothèque peuvent inclure un autre Libtool de la bibliothèque (ce qui est pratique lorsque vous avez une hiérarchie profonde de code source et vous êtes à la construction d'une bibliothèque à chaque niveau). Aussi Libtool commodité des bibliothèques peut être utilisé pour construire une bibliothèque partagée si vous le souhaitez. Automake de bibliothèques statiques ne peuvent pas.
Vous pouvez simplement spécifier les fichiers source dans un projet/src/Makefile.suis et ne pas avoir un Makefile.suis dans ctrnn:
ou vous pouvez utiliser un libtool la commodité de la bibliothèque. Dans ctrnn/Makefile.suis, mettre:
et dans src/Makefile.suis, mettre
Si vous n'utilisez pas déjà libtool, vous devrez également ajouter LT_INIT à configurer.ac.
Mieux encore, vous pouvez FORCER a faire à l'aide d'une source de moins de cible en faisant ceci:
Le secret de la sauce est
nodist_EXTRA_xxxx_la_SOURCES
.Plus de détails ici: https://www.gnu.org/software/automake/manual/html_node/Libtool-Convenience-Libraries.html