undefined reference to `pthread_join'报错怎么解决
原来makefile文件为:
# 编译器和编译选项
CC = gcc
CFLAGS = -Wall -lpthread
# 源文件和目标文件
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
# 目标可执行文件
TARGET = app
# 默认目标
all: $(TARGET)
# 链接目标文件生成可执行文件
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
# 编译每个源文件生成目标文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 清理生成的文件
clean:
rm -f $(OBJS) $(TARGET)
编译后报错为
$ make
gcc -Wall -lpthread -c main.c -o main.o
gcc -Wall -lpthread -c capture.c -o capture.o
gcc -Wall -lpthread -o app main.o capture.o
/usr/bin/ld: main.o: in function `main':
main.c:(.text+0x3c): undefined reference to `pthread_create'
/usr/bin/ld: main.c:(.text+0x64): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status
make: *** [Makefile:17: app] Error 1
讲makefile文件中的
$(CC) $(CFLAGS) -o $@ $^
改为
$(CC) -o $@ $^ $(CFLAGS)
编译正确,原因为:
链接命令 gcc -Wall -lpthread -o app main.o capture.o 把 -lpthread 放在了对象文件 main.o 和 capture.o 之前。当链接器处理 -lpthread 时,它会把 pthread 库加载进来,但此时还没有遇到 main.o 中对 pthread_create 和 pthread_join 的调用,所以链接器不会记录这些符号的需求。之后,当链接器处理 main.o 时,遇到了对 pthread_create 和 pthread_join 的调用,但它不会再回头去查找之前已经处理过的 pthread 库,从而导致链接错误。
而当你把 -lpthread 放在链接命令的最后,如 gcc -Wall -o app main.o capture.o -lpthread,链接器会先处理 main.o 和 capture.o,记录下所有未定义的符号,然后在处理 -lpthread 时,就可以找到这些符号的定义,从而正确完成链接。


3574

被折叠的 条评论
为什么被折叠?



