我有一个C程序,我一直在多台机器上工作,虽然它在我的MacBook上正确编译,我无法让程序在Windows子系统Linux上运行,运行Ubuntu 18.04并使用gcc。
该程序产生多个线程,当我尝试在Windows子系统上编译它时,我得到错误undefined reference to `pthread_create
。
其他一些问题,如this,this和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 $@ $<
我在#include <pthread.h>
中包含pthread标头,并用pthread_create
调用pthread_create(&multiplierThread, NULL, multiplier, arg)
函数。
有谁知道什么可能导致此编译器错误?
总的来说,使用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命令的末尾,在所有调用它预期提供的函数的目标文件之后。