在WSL上修复pthread_create参考错误

时间:2019-04-09 14:11:52

标签: c ubuntu gcc ubuntu-18.04 windows-subsystem-for-linux

我有一个正在多台计算机上使用的C程序,尽管它可以在MacBook上正确编译,但是我无法让该程序在Linux的Windows子系统上运行,运行Ubuntu 18.04并使用gcc进行编译。

该程序产生多个线程,当我尝试在Windows子系统上进行编译时,出现错误undefined reference to `pthread_create

还有其他一些问题,例如thisthisthis,建议使用-lpthread作为编译器标志来解决此问题,但是我已经在这样做并且可以在OSX上正常编译,因此我怀疑该问题可能与WSL配置有关。

我的Makefile是:

CC = gcc
CCOPTS = -Wall -c -g -ggdb
LINKOPTS = -Wall -g -ggdb -lpthread

all: calc

calc: calc.o smp3_tests.o testrunner.o
    $(CC) $(LINKOPTS) -o $@ $^

calc.o: calc.c calc.h
    $(CC) $(CCOPTS) -o $@ $<

我在#include <pthread.h>中包含pthread标头,并在pthread_create中调用pthread_create(&multiplierThread, NULL, multiplier, arg)函数。

有人知道是什么原因导致此编译器错误吗?

1 个答案:

答案 0 :(得分:3)

总体而言,对于GCC,您应该同时使用-pthread选项来编译源代码和链接对象。然后,您不需要(也不希望)在链接库中明确包含-lpthead

CC = gcc
CFLAGS = -Wall -c -g -ggdb -pthread
LDFLAGS= -Wall -g -ggdb -pthread

calc: calc.o smp3_tests.o testrunner.o
    $(CC) $(LDFLAGS) -o $@ $^

calc.o: calc.c calc.h
    $(CC) $(CFLAGS) -o $@ $<

但是,如果您明确链接-lpthread,则链接命令中目标文件和-l选项的出现顺序对于许多链接器来说很重要。如果完全给出,则-lpthread选项应该出现在链接命令的末尾,位于所有预期提供函数的目标文件之后。