【问题标题】:Fixing pthread_create reference error on WSL修复 WSL 上的 pthread_create 引用错误
【发布时间】:2019-04-09 14:11:52
【问题描述】:

我有一个 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 $@ $<

我将 pthread 标头包含在 #include &lt;pthread.h&gt; 中,并使用 pthread_create(&amp;multiplierThread, NULL, multiplier, arg) 调用 pthread_create 函数。

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

【问题讨论】:

  • 我对 WSL 一无所知,但除非它使用与 GNU 工具链不同的约定,否则不要使用 CCOPTSLINKOPTS,使用常规变量名称(即 CFLAGSLDFLAGS)。如果没有其他原因,那是因为它使显式编写其他规则变得多余。

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


【解决方案1】:

总体而言,使用 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 选项应该出现在链接命令的末尾,在所有调用它应该提供的函数的目标文件之后。

【讨论】:

  • 您好约翰,感谢您的回答!这个解决方案解决了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 2012-01-05
  • 2019-12-08
  • 2011-12-17
  • 1970-01-01
相关资源
最近更新 更多