`make` не связывает автоматически локально установленную библиотеку (CS50x cs50.h) - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь реплицировать песочницу CS50x в моей системе Gentoo, но я получаю такую ​​ошибку при запуске make

% make price
cc     price.c   -o price
/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/cc9TASaL.o: in function `main':
price.c:(.text+0x15): undefined reference to `get_float'
collect2: error: ld returned 1 exit status
make: *** [<builtin>: price] Error 1

Для справки, это источник файл:

% cat price.c
#include <stdio.h>
#include <cs50.h>

int main(void)
{
    float price = get_float("What's the price?\n");
    printf("Your total is %.2f (VAT included)\n", price * 1.22);
}

Я вручную установил libcs50 в своей системе:

# ldconfig -p | grep cs50 
libcs50.so.10 (libc6,x86-64) => /usr/local/lib64/libcs50.so.10
libcs50.so (libc6,x86-64) => /usr/local/lib64/libcs50.so

И когда я компилирую файл с

% gcc -lcs50 price.c -o price

, я не получаю ошибок . Я что-то неправильно настроил в своей системе, или я неправильно понял, как работает make? После просмотра лекции у меня создалось впечатление, что make «автоматически» добавит параметр -lcs50.

Спасибо!

РЕШЕНИЕ Установить CC , CFLAGS и LDLIBS согласно этим инструкциям: https://cs50.readthedocs.io/libraries/cs50/c/. Все "автомагические" вещи в видео лекций возможны благодаря этим переменным окружения.

1 Ответ

0 голосов
/ 15 августа 2020

Make имеет встроенное правило, которое может создавать исполняемый файл из одного .c файла:

%: %.c
#  recipe to execute (built-in):
    $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@

Таким образом вам не нужно писать Makefile для большинства простых задач, подобных этой. . Вы можете найти его, используя make -p | grep -C 3 '%: %.c\b'.

Встроенная переменная LINK.C оценивается как:

LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

Увидев ваш последний комментарий, все, что вам нужно сделать, это вызвать make при переопределении правильные переменные:

make price CC=clang CFLAGS="-fsanitize=signed-integer-overflow -fsanitize=undefined -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow" LDLIBS="-lcrypt -lcs50 -lm"
...