修复 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 命令的末尾,在所有调用它期望提供的函数的目标文件之后。
我有一个 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 命令的末尾,在所有调用它期望提供的函数的目标文件之后。