D'abord, éviter de nommer votre exécutable test
puisqu'il est nom de programme standard (au moins sur POSIX). Puis, lisez documentation of GNU make. Il contient une section de tutoriel.
Enfin, GNU make a plusieurs règles intégrées, que vous pouvez obtenir avec make -p
Voir this answer pour un exemple.
Je recommande fortement de compiler avec toutes les informations d'avertissement et de débogage (c'est-à-dire avec gcc -Wall -Wextra -g
si vous utilisez GCC). Mettez donc CFLAGS+= -Wall -Wextra -g
et CC=gcc
dans votre Makefile
.
Pour lier avec votre -lcjson
ajoutez LIBES+= -lcjson
dans votre Makefile
. Rappelez-vous que l'onglet caractères sont importants dans un Makefile
(utilisez donc un éditeur, par exemple emacs
, capable de les éditer).
Donc, essayez:
# your Makefile, replace four spaces with tab
CC= gcc
CFLAGS+= -Wall -Wextra -g
RM= rm -f
MY_SOURCES=$(wildcard *.c)
## above could be an MY_SOURCES= file1.c file2.c otherfile.c
MY_OBJECTS=$(patsubst %.c,%.o,$(MY_SOURCES))
#
LIBES= -lcjson
#
.PHONY: all clean
##
all: myprog
##
clean:
$(RM) myprog *.o *~
myprog: $(MY_OBJECTS)
Utilisez make --trace
ou remake
-x
pour déboguer votre Makefile
Si vous Haver plusieurs fichiers source*.c
(qui est translation units) reliés entre eux dans le même programme, vous devriez avoir un fichier d'en-tête commun myheader.h
(pour partager des déclarations communes de toutes vos fonctions publiques et variables) qui devrait être #include
dans chaque fichier source. Ensuite, vous devez dépendre:
MY_HEADER= myheader.h
%.o: %.c $(MY_HEADER)
Notez que (avec ou sans Makefile
) l'ordre de program arguments to gcc
est très significative. Voir this.
Je crois que votre question est la raison pour laquelle vous êtes indéfini, vous pouvez revoir la séquence de spécification de la lib, aussi -test1.c devrait être -c test1.c – Pras
@Pras: Non, '-c' est nécessaire pour obtenir un fichier objet. Lors de la compilation d'un fichier source unique dans un fichier exécutable, il ne doit pas * être * utilisé. –
@Aditya: vous n'êtes * pas * en train de compiler le code C de la bibliothèque '-lcjson'. Vous êtes juste * lier * et utiliser cette bibliothèque. –