2017-09-19 5 views
4

PrésentationComment compiler le code C avec la bibliothèque "Unix networking programming book"?

J'ai commencé à suivre le livre Unix de programmation réseau 2003. J'ai téléchargé le code source sur le site officiel ici: source code. Cela inclut un fichier README, qui vous indique comment créer/compiler tous les fichiers inclus pour le livre.

J'ai suivi ces instructions sur cette page GitHub (qui a également le code source) github Et réussi à utiliser les fichiers make et configurer la source avec succès de ce qu'il semble.

Makefile pour compiler les exemples fournis

Le premier chapitre du programme sont des exemples dans le répertoire en surbrillance ci-dessous. Mon programme est '[LIVRE] daytimetcpcli.c' et placé à l'intérieur du Makefile fourni. Makefile A l'intérieur du répertoire cible:

unpv13e/intro$

(comprend tous les autres exemples de programmes de livre)

include ../Make.defines 

PROGS = [BOOK]daytimetcpcli.c daytimetcpcli1 daytimetcpcli2 daytimetcpcli3 \ 
    daytimetcpsrv daytimetcpsrv1 daytimetcpsrv2 daytimetcpsrv3 \ 
    daytimetcpcliv6 daytimetcpsrvv6 \ 
    byteorder 

all: ${PROGS} 




[BOOK]daytimetcpcli: [BOOK]daytimetcpcli.o 
    ${CC} ${CFLAGS} -o [email protected] [BOOK]daytimetcpcli.o ${LIBS} 

daytimetcpcli1: daytimetcpcli1.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpcli1.o ${LIBS} 

daytimetcpcli2: daytimetcpcli2.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpcli2.o ${LIBS} 

daytimetcpcli3: daytimetcpcli3.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpcli3.o ${LIBS} 

daytimetcpsrv: daytimetcpsrv.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpsrv.o ${LIBS} 

daytimetcpsrv1: daytimetcpsrv1.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpsrv1.o ${LIBS} 

daytimetcpsrv2: daytimetcpsrv2.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpsrv2.o ${LIBS} 

daytimetcpsrv3: daytimetcpsrv3.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpsrv3.o ${LIBS} 

daytimetcpcliv6: daytimetcpcliv6.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpcliv6.o ${LIBS} 

daytimetcpsrvv6: daytimetcpsrvv6.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpsrvv6.o ${LIBS} 

byteorder: byteorder.o 
    ${CC} ${CFLAGS} -o [email protected] byteorder.o ${LIBS} 

clean: 
    rm -f ${PROGS} ${CLEANFILES} 

Le problème

Je mis mon dossier à l'intérieur du Makefile. Cependant, quand je cours à nouveau. Cela se produit:

make: Nothing to be done for 'all'.

J'ai essayé aussi simplement normale avec GCC compilation:

gcc [BOOK]daytimetcpcli.c

fatal error: unp.h: No such file or directory

Alors ma question est de savoir comment puis-je compiler mon programme avec le Makefile fourni? est ce que j'ai fait correctement? Et je sais que je peux compiler avec GCC, mais je ne connais pas la syntaxe pour inclure les fichiers d'en-tête nécessaires avec GCC. C'est pourquoi j'ai essayé de le faire avec le Makefile.

Ce qui suit dans ma deuxième question, comment puis-je compiler sans makefile? (en utilisant gcc avec les correctes -I en-têtes)? gcc programme.c -I unp.h?

* Note '[LIVRE] daytimetcpcli.c' = daytimetcpcli.c dans le code source fourni sur le site officiel, dans la source.

+1

Il vous manque clairement le fichier d'en-tête lorsque vous compilez directement. Le fichier Make.defines configure CFLAGS pour qu'il puisse le trouver. Je suis surpris par les caractères '[BOOK]', les crochets sont spéciaux pour le shell. Essayez plutôt d'utiliser le caractère de soulignement ou de les supprimer complètement. –

+0

@icarus noté et corrigé merci, je ne savais pas cela. – digitalXmage

Répondre

3

Première votre erreur dans le Makefile:

make: Nothing to be done for 'all'.

Cela signifie que tous sont des cibles (le contenu de la variable PROGS) existent et sont plus récents que leurs dépendances (ce que doit être utilisé pour les construire, IOW la source).

Il est inattendu pour vous parce que vous n'avez pas ajouté le binaire résultant à la variable PROGS, mais le fichier source. Comme il existe, Make considère qu'il n'a plus rien à faire.Pour corriger cela, changer:

PROGS = [BOOK]daytimetcpcli.c ... 

à

PROGS = [BOOK]daytimetcpcli ... 

BTW, ce n'est pas une bonne idée d'utiliser des caractères shell spéciaux comme [ et ] dans votre nom de fichier, ne pas oublier d'échapper ou de citation eux lors de l'utilisation du fichier dans les commandes shell.


Maintenant votre erreur dans la commande de compilation:

fatal error: unp.h: No such file or directory

Cela signifie que vous ne l'avez pas dit gcc où trouver les fichiers d'en-tête. Pourquoi cela fonctionnerait-il avec make? Parce que la commande dans le Makefile comprend des options supplémentaires: ${CFLAGS} et ${LIBS}, deux variables qui sont définies dans Make.defines (voir la ligne include).

Vous commande correcte de compilation devrait être:

gcc -o "[BOOK]daytimetcpcli" -I../lib -g -O2 -D_REENTRANT -Wall ../libunp.a -lpthread "[BOOK]daytimetcpcli.c" 

(en fait, les lignes dans le Makefile ci-dessus n'appellent l'éditeur de liens et CFLAGS n'est pas là nécessaire, il est utilisé que lors de la création des .o fichiers dont la compilation est implicite)