WSL下编译C程序出现pthread_create未定义引用错误求助
解决WSL Ubuntu 18.04下
pthread_create未定义引用的问题 这种跨平台编译的坑我踩过好几次,咱们先从最常见的核心原因说起:
关键问题:GCC链接库的顺序要求
你遇到的问题大概率是链接顺序不对。Mac上的Clang(或Mac版GCC)对库的链接顺序要求比较宽松,但Ubuntu 18.04自带的GCC版本(一般是7.x系列)对链接顺序很严格:依赖某个库的目标文件必须放在该库选项的前面。
看你的Makefile链接命令:
$(CC) $(LINKOPTS) -o $@ $^
这里LINKOPTS里的-lpthread放在了目标文件$^(也就是calc.o、smp3_tests.o、testrunner.o)的前面。链接器会按顺序处理:先加载-lpthread,这时候还没遇到需要用到pthread符号的目标文件,就会跳过这个库;等后面处理目标文件时,发现pthread_create未定义,再回头找库已经晚了,所以报错。
解决办法:调整链接顺序
把-lpthread移到目标文件的后面就行,有两种改法:
- 直接修改链接命令(同时删掉原LINKOPTS里的
-lpthread避免重复):
LINKOPTS = -Wall -g -ggdb calc: calc.o smp3_tests.o testrunner.o $(CC) $(LINKOPTS) $^ -o $@ -lpthread
- 或者手动执行这条命令先验证:
gcc -Wall -g -ggdb calc.o smp3_tests.o testrunner.o -o calc -lpthread
如果能成功编译,就说明确实是顺序问题。
其他排查方向
如果调整顺序后还是报错,可以检查这两点:
- 确认Ubuntu 18.04上安装了pthread的开发库:
虽然默认可能已经安装,但万一缺失也会导致链接失败。sudo apt-get install libpthread-dev - 检查Makefile里有没有其他地方覆盖了
LINKOPTS或者CC变量,导致-lpthread没被正确加入链接命令。
内容的提问来源于stack exchange,提问作者Jared Forth
相关产品推荐
相关产品推荐

