Исправление ошибки ссылки pthread_create на WSL - PullRequest
1 голос
/ 09 апреля 2019

У меня есть программа на 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 $@ $<

Я включаю заголовок pthread с #include <pthread.h> и вызываю функцию pthread_create с pthread_create(&multiplierThread, NULL, multiplier, arg).

Кто-нибудь знаетчто может быть причиной этой ошибки компилятора?

1 Ответ

3 голосов
/ 09 апреля 2019

В целом, в 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 появляются в команде link, важны для многих компоновщиков.Если задано вообще, то опция -lpthread должна появляться в конце команды link после всех объектных файлов, которые вызывают функции, которые она должна предоставлять.

...