gcc 关于链接库的参数顺序


现象:

buildbot@worker:/buildbot/allbuild/build$ make
cc    -c -o main.o main.c
cc    -c -o send.o send.c
cc    -c -o status.o status.c
cc    -c -o random.o random.c
cc -o netstorm -lpthread main.o send.o status.o random.o
/usr/bin/ld: main.o: in function `main':
main.c:(.text+0x3b): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status

buildbot@worker:/buildbot/allbuild/build$ gcc --version
gcc (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0

buildbot@worker:/buildbot/allbuild/build$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.34

源码:

LDFLAGS = -lpthread

PROG = netstorm
OBJS = main.o send.o status.o random.o

ALL: netstorm

$(PROG): $(OBJS)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

根据 这篇 回答,问题是 gcc 要求库导入的参数要后于对象文件或源文件。

所以调整 Makefile,使其这样:

$(PROG): $(OBJS)
    $(CC) $^ -o $@ $(CFLAGS) $(LDFLAGS)

看其他构建系统,将导入库单独提出来的,所以还需要深入学习。

tool("link") {
    command = "g++ {{ldflags}} -o $outfile @$rspfile {{solibs}} {{libs}}"
}