修复 WSL 上的 pthread_create 引用错误

Fixing pthread_create reference error on WSL

我有一个 C 程序,我一直在多台机器上工作,虽然它在我的 MacBook 上编译正确,但我无法让程序在 Windows 子系统上为 Linux 编译, 运行 Ubuntu 18.04 并使用 gcc。

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

其他几个问题,例如 this, this, and this,建议使用 -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 $@ $<

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

有谁知道是什么导致了这个编译器错误?

总的来说,对于 GCC,您应该使用 -pthread 选项来编译源代码和 linking 对象。然后您不需要(也不想)在您的 link 库中明确包含 -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 $@ $<

如果您 link -lpthread 显式,那么目标文件和 -l 选项出现在 link 命令对许多 link 用户来说意义重大。如果完全给出,那么 -lpthread 选项应该出现在 link 命令的末尾,在所有调用它期望提供的函数的目标文件之后。