修复WSL上的pthread_create引用错误

问题描述 投票:1回答:1

我有一个C程序,我一直在多台机器上工作,虽然它在我的MacBook上正确编译,我无法让程序在Windows子系统Linux上运行,运行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)函数。

有谁知道什么可能导致此编译器错误?

c ubuntu gcc ubuntu-18.04 windows-subsystem-for-linux
1个回答
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选项应出现在link命令的末尾,在所有调用它预期提供的函数的目标文件之后。

© www.soinside.com 2019 - 2024. All rights reserved.