2017-06-08 3 views
1

Je suis très nouveau dans les makefiles. Je compile le fichier de code c qui contient la bibliothèque cjson du terminal en utilisant la commandeCréer un makefile pour le code cjson avec -lcjson pour json parser dans c

gcc -test1.c -o test -lcjson 

avec -lcjson enfin et son fonctionnement parfaitement. Mais comment compiler le même code en utilisant makefile car je dois enfin ajouter -lcjson. si j'utilise sans -lcjson je reçois erreur

/tmp/cc4ESrx1.o: In function `parse_json': 
test1.c:(.text+0x2d): undefined reference to `cJSON_Parse' 
test1.c:(.text+0x42): undefined reference to `cJSON_GetObjectItem' 
test1.c:(.text+0x59): undefined reference to `cJSON_GetObjectItem' 
collect2: error: ld returned 1 exit status 

J'utilise un code RTOS

merci à l'avance

+1

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

+0

@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é. –

+0

@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. –

Répondre

0

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.