2017-07-15 6 views
2

複数のC静的ライブラリに依存するC実行可能ファイルを作成しようとしています。 私はライブラリが2つあります: ../libs/libsulibs.a../ppm_client/libppm_client.aです。ここでlibsulibs.a複数のCライブラリをCの実行可能ファイルにリンクする

の一部の機能は、私のMakefile

../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} 

されるコールlibppm_client.a私は正常 ../ppm_client/Makefile

このメイクファイルを通じて

libsulibs.aを作成します

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} 

このメイクファイルではlibppm_client.aが正常に作成されています。

は今、現在のディレクトリに、私は実行可能

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 

を作成するための主なMakefileを持っている。しかし、私はmakeを実行すると、それはエラーで終わる:undefined reference to pthread_init。 pthread_initはlibsulibs.aで定義された関数であり、標準pthreadライブラリに依存しています。

[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 

私がここで欠けているものを助けてください。

+0

'-lpthread'とのリンク – dlmeetei

+1

$ {STANDARD_LIBS}は-lpthreadのみです。 –

+1

フロント部分の$ {STANDARD_LIBS}を動かすことは役に立ちますか? – dlmeetei

答えて

0

Woa !!ライブラリの順序を変更する@Antti Haapalam

で働いていました。

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

:メインのMakefileで

は、私はから順番を変え

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

誰もが推論をコメントすることができますか?

+0

私は、順序は、依存ライブラリを最初に指定し、次に独立していると思います。私の場合。 libppm_client.aはlibsulibs.aに依存しています。libsulibs.aはpthread標準ライブラリに依存しています。 –

関連する問題