通过CFLAGS添加库仍会导致链接失败

时间:2015-05-14 15:51:03

标签: bash makefile flags

我正在尝试在VirtualBox上编译Ubuntu 12.04上的程序,我收到以下错误:

daniel@daniel-VirtualBox:~/Documents/Redes/t1$ make
gcc -g    -c -o bwc.o bwc.c
gcc -g    -c -o jsocket6.4.o jsocket6.4.c
gcc -g    -c -o Dataclient-seqn.o Dataclient-seqn.c
gcc -g    -c -o bufbox.o bufbox.c
gcc -g  bwc.o jsocket6.4.o Dataclient-seqn.o bufbox.o -o bwc-orig -lpthread  
Dataclient-seqn.o: In function `Now':
/home/daniel/Documents/Redes/t1/Dataclient-seqn.c:68: undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
make: *** [bwc-orig] Error 1

我发现我必须添加-lrt,但我不知道该怎么做,这是我的makefile:

CC=gcc
CFLAGS=-g # -m32

BIN=bwc-orig bwc bwc-tcp bws-tcp

all: $(BIN)

bwc-orig: bwc.o jsocket6.4.o Dataclient-seqn.o jsocket6.4.h bufbox.o 
    $(CC) $(CFLAGS) bwc.o jsocket6.4.o Dataclient-seqn.o bufbox.o -o $@ -lpthread  

bwc: bwc.o jsocket6.4.o Dataclient-bigseq.o jsocket6.4.h bufbox.o 
    $(CC) $(CFLAGS) bwc.o jsocket6.4.o Dataclient-bigseq.o bufbox.o -o $@ -lpthread 

bwc-tcp: bwc.o jsocket6.4.o Data-tcp.o jsocket6.4.h
    $(CC) $(CFLAGS) bwc.o jsocket6.4.o Data-tcp.o -o $@ -lpthread 

bws-tcp: bws.o jsocket6.4.o Data-tcp.o jsocket6.4.h
    $(CC) $(CFLAGS) bws.o jsocket6.4.o Data-tcp.o -o $@ -lpthread 

cleanall: 
    rm -f $(BIN) *.o

我修改了makefile,添加-lrt标志:

CC=gcc
CFLAGS=-g -lrt # -m32

BIN=bwc-orig bwc bwc-tcp bws-tcp

all: $(BIN)

bwc-orig: bwc.o jsocket6.4.o Dataclient-seqn.o jsocket6.4.h bufbox.o 
    $(CC) $(CFLAGS) bwc.o jsocket6.4.o Dataclient-seqn.o bufbox.o -o $@ -lpthread  

bwc: bwc.o jsocket6.4.o Dataclient-bigseq.o jsocket6.4.h bufbox.o 
    $(CC) $(CFLAGS) bwc.o jsocket6.4.o Dataclient-bigseq.o bufbox.o -o $@ -lpthread 

bwc-tcp: bwc.o jsocket6.4.o Data-tcp.o jsocket6.4.h
    $(CC) $(CFLAGS) bwc.o jsocket6.4.o Data-tcp.o -o $@ -lpthread 

bws-tcp: bws.o jsocket6.4.o Data-tcp.o jsocket6.4.h
    $(CC) $(CFLAGS) bws.o jsocket6.4.o Data-tcp.o -o $@ -lpthread 

cleanall: 
    rm -f $(BIN) *.o

但我得到以下输出(它几乎相同,除了我在开始时看到-lrt标志):

daniel@daniel-VirtualBox:~/Documents/Redes/t1$ make
gcc -g -lrt    -c -o bwc.o bwc.c
gcc -g -lrt    -c -o jsocket6.4.o jsocket6.4.c
gcc -g -lrt    -c -o Dataclient-seqn.o Dataclient-seqn.c
gcc -g -lrt    -c -o bufbox.o bufbox.c
gcc -g -lrt  bwc.o jsocket6.4.o Dataclient-seqn.o bufbox.o -o bwc-orig -lpthread

Dataclient-seqn.o: In function `Now':
/home/daniel/Documents/Redes/t1/Dataclient-seqn.c:76: undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
make: *** [bwc-orig] Error 1

我不知道如何添加-lrt标志。我实际上对makefile并不了解,也不知道该怎么做。

感谢。

编辑:没关系,我刚解决了。在运行make并获得最后一个输出之后,我决定运行

gcc -g bwc.o jsocket6.4.o Dataclient-seqn.o bufbox.o -o bwc-orig -lpthread -lrt

它有效,因为问题是我必须在最后添加-lrt。

非常感谢。

1 个答案:

答案 0 :(得分:1)

库标志需要最后。你看到的任何地方-lpthread也会添加-lrt(或者可能重构一个变量,所以如果你需要添加更多的库,你只需要改变一个地方)。