undefined reference to `pthread_join‘报错怎么解决

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 时,就可以找到这些符号的定义,从而正确完成链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值