Makefile: как указать имя библиотеки в конце команды, используя patsubst - PullRequest
0 голосов
/ 04 мая 2020

Я новичок в Makefile, C и Linux. Я использую g cc & Ubuntu. Я столкнулся с проблемой при попытке скомпилировать код со ссылкой на библиотеку.

Вот моя проблема. У меня есть:

a_tests.c & b_tests.c files in "tests" folder
lib.a file in "build" folder

Вот коды в Makefile, связанные с проблемой:

CFLAGS=-g -O2 -Wall -Wextra -Isrc -DNDEBUG $(OPTFLAGS)
TARGET=build/lib.a

TEST_SRC=$(wildcard tests/*_tests.c)
TESTS=$(patsubst %.c,%,$(TEST_SRC))

tests: CFLAGS += $(TARGET)
tests: $(TESTS)

Когда файлы тестов скомпилированы, ошибки «неопределенная ссылка на« XXXfunction »будут ответ на запрос. Потому что то, что выполняется позади, это

gcc -g -O2 -Wall -Wextra -Isrc -DNDEBUG build/lib.a tests/a_tests.c -o test/a_tests
gcc -g -O2 -Wall -Wextra -Isrc -DNDEBUG build/lib.a tests/b_tests.c -o test/b_tests

Но после имени выходного файла следует поместить «build / lib.a» (если я вручную введу приведенные ниже команды, коды будут успешно скомпилированы) , ie:

gcc -g -O2 -Wall -Wextra -Isrc -DNDEBUG tests/a_tests.c -o test/a_tests build/lib.a 
gcc -g -O2 -Wall -Wextra -Isrc -DNDEBUG tests/b_tests.c -o test/b_tests build/lib.a 

Но я не знаю, как изменить в Makefile, я пробовал опции -l -L, они не работали. Это предупредит, что "не может найти файл .a". Любая помощь будет оценена. Огромное спасибо заранее!

1 Ответ

1 голос
/ 04 мая 2020

Определите библиотеку как зависимость, потому что она одна. Он будет добавлен в конце других зависимостей, здесь: источник.

CFLAGS=-g -O2 -Wall -Wextra -Isrc -DNDEBUG $(OPTFLAGS)
TARGET=build/lib.a

TEST_SRC=$(wildcard tests/*_tests.c)
TESTS=$(TEST_SRC:%.c=%)

tests: $(TESTS)

$(TESTS): $(TARGET)

Библиотека не обязательно должна быть после выходного файла , но после зависимости входной файл .

Makefile еще более упрощен:

  • Заменил patsubst на более простое выражение.
  • Переместил цель tests вверх, поэтому он находится в качестве первой и, следовательно, цели по умолчанию.

Удачи!

...