C: la Création de bibliothèque statique et en les reliant à l'aide d'un Makefile
Je suis en train de comprendre les Bibliothèques statiques et partagées.
Je veux faire de la suivante pour créer un fichier makefile qui ne séparée compilation et la liaison tel qu'une bibliothèque statique est créée et liée
dans la formation de la finale de la statique exécutable.
J'ai le code suivant pour le Makefile, mais j'obtiens l'erreur suivante
Makefile:13: *** missing separator. Stop.
Mais je suis aussi en train d'essayer de comprendre comment se fait le lien/créer des bibliothèques.
Si j'exécute les commandes après line 12
dans le terminal, mais pas dans le fichier makefile.
myProgram: main.o addSorted.o freeLinks.o
gcc -lm -o myProgram main.o addSorted.o freeLinks.o
main.o: main.c
gcc -O -c -lm main.c main.h
addSorted.o: addSorted.c addSorted.h
gcc -O -c -lm addSorted.c
freeLinks.o: freeLinks.c freeLinks.h
gcc -O -c -lm freeLinks.c
ar rc libmylib.a main.o addSorted.o freeLinks.o //Error Line
ranlib libmylib.a
gcc -o foo -L. -lmylib foo.o
clean:
rm -f myProgram main.o addSorted.o freeLinks.o
Aussi, si vous pouvez aider à l'amélioration du code, je voudrais vraiment l'apprécier.
- double possible de l'erreur: manque séparateur
- Les trois
ar
,ranlib
etgcc
lignes sont censés être la recette pour quelle cible? - Je suis nouvelle C/makefile et les bibliothèques. Je suppose que pour
myProgram
. C'est pourquoi j'ai besoin d'aide. Aussi la ligne où j'obtiens l'erreur, ne contient pas detab
- Q: "la ligne où j'obtiens l'erreur, ne contient pas d'onglet..." A: C'est ça le problème. Vous avez besoin d'une "cible" (par exemple,
mylib.a
, justifié à gauche), suivie par deux lignes qui commencent par un "onglet" (ar rc libmylib.a main.o addSorted.o freeLinks.o
, puisranlib libmylib.a
). Les deux lignes doivent être consécutives (pas intervenir les lignes vides). Voici un bon tutoriel: Un Simple fichier Makefile Tutoriel - la gcc de l'éditeur de liens gère les paramètres de ligne de commande dans l'ordre dans lequel ils sont répertoriés. l'éditeur de liens ne sera pas inclure quoi que ce soit à partir d'une bibliothèque, sauf si il y a un suspens nom de satisfaire les besoins. par conséquent, rien ne sera lié à partir de la bibliothèque de mathématiques. Suggèrent de déplacer le "- lm " à la fin de la ligne de commande liens.
- le compilateur gcc a absolument pas besoin de bibliothèques externes., donc le compiler les déclarations ne devraient pas avoir '-lm'
- le format d'un fichier makefile règle est la suivante: 1) destinationFile : source de toutes les autres dépendances 2) chaque ligne de commande suivant la première ligne doit être en retrait, avec un onglet. Les lignes de votre problème à un ne sont pas correctement mis en forme
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Cet ensemble de règles, d'abord compile tous les fichiers, alors il fait de la bibliothèque (libmylib.a) de la cible, et qu'il utilise de l'artefact pour lier le fichier exécutable.
J'ai également ajouté séparé redondant objectif de faire libs seulement.
Fichiers nécessaires:
main
?. Et une fois que j'ai créé à la bibliothèque, il est lié àmyProgram
? Cela aide.Shared Libraries
également de travailler de la même façon? Ou je dois appeler la même demain
*.o
fichiers avec-fpic
et des liens avec-shared
. Voici une bonne explication (pas sur les makefiles, shared libs uniquement): cprogramming.com/tutorial/shared-libraries-linux-gcc.htmlmain.o: main.c gcc -O -fpic -lm main.c main.h
. Serait-ce correct façon de faire pour Partagé?gcc -c -fpic freeLinks.c
etgcc -c -fpic addSorted.c
. Puisgcc -shared -o libmylib.so freeLinks.o addSorted.o
de fabriquer une bibliothèque partagée. Ensuite, vous pouvez lier un fichier exécutable avec l'aide de-lmylib
, et n'oubliez pas de l'ajouter dans l'annuaire du$LD_LIBRARY_PATH
de la coquille où vous allez exécuter le fichier exécutable.-lm
) sur la compilation étapes. J'ai corrigé le projet de makefile dans la réponse.*.o
fichiers avec-fpic
et sans elle), donc pour faire partagé et les bibliothèques statiques en même temps, vous devez utiliser des sous-répertoires ou de fichiers différents de nommage.Un makefile n'est pas un script shell. C'est un fichier de configuration
pour un système expert. Plus précisément un système expert
sait, si vous le dites, de la façon la plus efficace de créer des fichiers et de leurs
dépendances avec un minimum de re-rendre les fichiers qui n'ont pas besoin
pour être refait.
Si vous regardez la première règle que vous avez:
qui indique au système comment faire un fichier appelé "myProgram" si c'
décide qu'il doit faire. Les pièces après les deux-points
sont des fichiers qui myProgram besoins. Si ils ne sont pas là, ou
faire décide qu'ils ne sont pas à jour, make va essayer de trouver quelques
recette qui peut être utilisé pour créer ou mettre à jour. Une fois
tout ce qui est fait, de rendre exécute alors le "gcc ..." en ligne et
suppose que permettra de créer ou de mettre à jour myProgram.
L'ar et ranlib lignes que vous avez ne correspond pas au besoin de la syntaxe pour
un makefile à la règle. Le look d'entre eux, ils semblent être
une recette pour faire libmylib.un. Si vous les mettez dans le
la syntaxe de faire besoin de dire que, vous obtenez:
myProgram doit dépendre de la bibliothèque elle-même, plutôt que de la
contenu de la bibliothèque, et il est préférable de mettre les options de bibliothèque à
la fin:
si vous le souhaitez, vous pouvez utiliser une option pour demander à gcc de regarder pour les bibliothèques
dans le répertoire courant:
Il y a aussi des makefile variables qui peuvent vous aider à ne pas avoir à répéter
tellement, donc je voudrais écrire la première règle:
cependant, il est peu probable que les principaux.o doit effectivement faire partie de la bibliothèque,
donc:
et de la bibliothèque de la règle comme:
l' $+ signifie ici "toutes les de la dépendance des noms de fichiers".
Enfin, si vous voulez gcc pour faire une réelle statique exécutable, et pas
suffit d'utiliser la bibliothèque que vous avez fait, vous avez besoin de passer l' 'statique' option
pour gcc.