2017-07-15 1 views
2

J'essaye de créer un exécutable C qui dépend de plusieurs bibliothèques statiques C. J'ai deux bibliothèques: ../libs/libsulibs.aet../ppm_client/libppm_client.a. libppm_client.a appelle certaines fonctions de libsulibs.aLiaison de plusieurs bibliothèques C à C créer un exécutable

Voici mon Makefiles

../libs/Makefile

LIBS=-lpthread 
CC=gcc 
CFLAGS=-Wall -g 
INCLUDES=-I . 
OBJ=WheelTimer.o threadApi.o LinkedListApi.o 
TARGET=libsulibs.a 
${TARGET}:$(OBJ) 
    ar rs ${TARGET} $(OBJ) 
%.o:%.c 
    ${CC} ${CFLAGS} -c ${INCLUDES} $< 
clean: 
    rm *.o 
    rm ${TARGET} 

Je crée avec succès libsulibs.a par ce makefile

../ppm_client/Makefile

CC=gcc 
CFLAGS=-Wall -g 
INCLUDES=-I . -I ../libs -I ../ppm 
OBJ=ppm_pkt_enums.o ppm_client.o ppm_client_sock.o 
TARGET=libppm_client.a 
${TARGET}:$(OBJ) 
    ar rs ${TARGET} ${OBJ} 
ppm_pkt_enums.o:ppm_pkt_enums.c 
    gcc -g -c ${INCLUDES} ppm_pkt_enums.c -o ppm_pkt_enums.o 
ppm_client.o:ppm_client.c 
    gcc -g -c ${INCLUDES} ppm_client.c -o ppm_client.o 
ppm_client_sock.o:ppm_client_sock.c 
    gcc -g -c ${INCLUDES} ppm_client_sock.c -o ppm_client_sock.o 
clean: 
    rm *.o 
    rm ${TARGET} 

Ce makefile a créé avec succès le libppm_client.a.

Maintenant, en dir courant, j'ai Makefile principale pour créer exécutable

CC=gcc 
CFLAGS=-g -Wall 
STANDARD_LIBS=-lpthread 
PPM_OBJ=ppm.o ppm_main.o 
LIBS_OBJ=libs/LinkedListApi.o libs/threadApi.o libs/WheelTimer.o 
PPM_LIBS=../libs/libsulibs.a 
PPM_CLIENT_LIBS=../ppm_client/libppm_client.a 
INCLUDES=-I . -I ../libs -I ../ppm_client 
TARGET:exe ${PPM_LIBS} ${PPM_CLIENT_LIBS} 

ppm.o:ppm.c 
    gcc -g -c ${INCLUDES} ppm.c -o ppm.o 
ppm_main.o:ppm_main.c 
    gcc -g -c ${INCLUDES} ppm_main.c -o ppm_main.o 

${PPM_LIBS}: 
    (cd ../libs; make) 
${PPM_CLIENT_LIBS}: 
    (cd ../ppm_client; make) 
exe:${PPM_LIBS} ${PPM_OBJ} ${STANDARD_LIBS} ${PPM_CLIENT_LIBS} 
    ${CC} ${CFLAGS} ${PPM_OBJ} -o exe -L ../libs -lsulibs -L ../ppm_client -lppm_client ${STANDARD_LIBS} 
clean: 
    rm *.o 
    (cd ../libs; make clean) 
    (cd ../ppm_client; make clean) 
    rm exe 

Mais quand je lance make, il se termine avec l'erreur: undefined reference to pthread_init. pthread_init est une fonction définie dans libsulibs.a et dépend de la bibliothèque pthread standard.

[email protected]:~/Documents/PeriodicPacketManager/ppm$ make 
(cd ../libs; make) 
make[1]: Entering directory `/home/vm/Documents/PeriodicPacketManager/libs' 
gcc -Wall -g -c -I . WheelTimer.c 
gcc -Wall -g -c -I . threadApi.c 
gcc -Wall -g -c -I . LinkedListApi.c 
ar rs libsulibs.a WheelTimer.o threadApi.o LinkedListApi.o 
ar: creating libsulibs.a 
make[1]: Leaving directory `/home/vm/Documents/PeriodicPacketManager/libs' 
gcc -g -c -I . -I ../libs -I ../ppm_client ppm.c -o ppm.o 
gcc -g -c -I . -I ../libs -I ../ppm_client ppm_main.c -o ppm_main.o 
(cd ../ppm_client; make) 
make[1]: Entering directory `/home/vm/Documents/PeriodicPacketManager/ppm_client' 
gcc -g -c -I . -I ../libs -I ../ppm ppm_pkt_enums.c -o ppm_pkt_enums.o 
gcc -g -c -I . -I ../libs -I ../ppm ppm_client.c -o ppm_client.o 
gcc -g -c -I . -I ../libs -I ../ppm ppm_client_sock.c -o ppm_client_sock.o 
ar rs libppm_client.a ppm_pkt_enums.o ppm_client.o ppm_client_sock.o 
ar: creating libppm_client.a 
make[1]: Leaving directory `/home/vm/Documents/PeriodicPacketManager/ppm_client' 
gcc -g -Wall ppm.o ppm_main.o -o exe -L ../libs -lsulibs -L ../ppm_client -lppm_client -lpthread 
../ppm_client/libppm_client.a(ppm_client_sock.o): In function `ppm_client_init_socket': 
/home/vm/Documents/PeriodicPacketManager/ppm_client/ppm_client_sock.c:138: undefined reference to `pthread_init' 
collect2: error: ld returned 1 exit status 
make: *** [exe] Error 1 

Veuillez aider ce qui me manque ici.

+0

Lien avec '-lpthread' également – dlmeetei

+1

$ {STANDARD_LIBS} est -lpthread uniquement. –

+1

Le déplacement du $ {STANDARD_LIBS} dans la partie avant aide-t-il? – dlmeetei

Répondre

0

Woa !!

@Antti Haapalam

Changer l'ordre des bibliothèques travaillées.

Dans Makefile principal, je l'ai changé l'ordre de:

${CC} ${CFLAGS} ${PPM_OBJ} -o exe -L ../libs -lsulibs -L ../ppm_client -lppm_client ${STANDARD_LIBS}

Pour:

${CC} ${CFLAGS} ${PPM_OBJ} -o exe -L ../ppm_client -lppm_client -L ../libs -lsulibs ${STANDARD_LIBS}

Quelqu'un peut-il commenter le raisonnement?

+0

Je pense, l'ordre est, spécifiez d'abord les bibliothèques dépendantes, puis indépendantes. Dans mon cas. libppm_client.a dépend de libsulibs.a qui dépend à son tour de la bibliothèque standard pthread. –