Неопределенная ссылка на «timer_create», хотя «-lrt» включает компиляцию - PullRequest
0 голосов
/ 04 апреля 2019

У меня возникли проблемы с Makefile для проекта, над которым я работаю. Я получаю «неопределенную ссылку на« timer_create »» и тому подобное, даже если они включены в linkopts. Я думаю, проблема в том, что библиотеки находятся в начале строки компиляции, а не в конце, но я довольно незнаком с таким Makefile, как этот. Как я могу убедиться, что ссылки идут в конце, а не в начале? Вот часть Makefile, о котором я говорю, make, он пытается это:

gcc -g -lpthread -lrt -Wall -o scheduler scheduler.o worker.o list.o smp5_tests.o testrunner.o

Но я уверен, что так и должно быть:

gcc -g -Wall -o scheduler scheduler.o worker.o list.o smp5_tests.o testrunner.o -lpthread -lrt

Вот Makefile:

CC = gcc
CCOPTS = -c -g -Wall
LINKOPTS = -g -lpthread -lrt -Wall

EXEC=scheduler
OBJECTS=scheduler.o worker.o list.o smp5_tests.o testrunner.o

all: $(EXEC)

$(EXEC):$(OBJECTS) 
        $(CC) $(LINKOPTS) -o $@ $^

1 Ответ

0 голосов
/ 04 апреля 2019

Я думаю, что проблема в том, что библиотеки находятся в начале строки компиляции, а не в конце, но я довольно незнаком с таким Makefile, как этот.

Ну, это специфично для GNU ld linker, а не для создания самого себя: ld разрешает зависимости за один проход слева направо, за исключением случаев между -Wl,--start-group и -Wl,--end-group (которые предназначены специально для обработки циклических зависимостей ). Это означает, что библиотеки должны располагаться после модулей (или других библиотек), которые их используют.

Как я могу убедиться, что ссылки идут в конце, а не в начале?

Рассмотрим, как это делается с (упрощенной версией) правила по умолчанию:

%: %.o
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

Здесь LDFLAGS - это «нормальные» флаги компоновщика, которые могут безопасно предшествовать списку объектов; LDLIBS - это список системных библиотек, используемых программой.

...