我有一个正在多台计算机上使用的C程序,尽管它可以在MacBook上正确编译,但是我无法让该程序在Linux的Windows子系统上运行,运行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)
函数。
有人知道是什么原因导致此编译器错误吗?
答案 0 :(得分: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
选项应该出现在链接命令的末尾,位于所有预期提供函数的目标文件之后。