Не могу разобраться с подключением библиотеки CS50 на gcc
Всем привет. Потихоньку прохожу курс CS50. Сижу на Windows 10 через VSCode с WSL Ubuntu. При компиляции программы с функцией get_int с помощью gcc выдает:
gcc -lcs50 -Wall -Wextra -Werror -c main.c -o main.o
gcc -lcs50 -Wall -Wextra -Werror -o main main.o
/usr/bin/ld: main.o: in function `main':
main.c:(.text+0xdd): undefined reference to `get_int'
collect2: error: ld returned 1 exit status
make: *** [makefile:13: main] Error 1
Библиотеку устанавливал командами:
$ curl -s https://packagecloud.io/install/repositories/cs50/repo/script.deb.sh | sudo bash
$ sudo apt-get install libcs50
Вот Makefile
SRCS = main.c
OBJS = $(SRCS:.c=.o)
CFLAGS = -lcs50 -Wall -Wextra -Werror
TARGET = main
CC = gcc
all: $(TARGET)
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
clean:
rm -rf ./*.o
fclean:
rm -rf $(TARGET) *.o
re: fclean all
Если компилировать через clang, ошибок нет, и программа запускается нормально. Но с clang другая беда, при компиляции через makefile выдает:
clang -lcs50 -Wall -Wextra -Werror -c main.c -o main.o
clang: error: -lcs50: 'linker' input unused [-Werror,-Wunused-command-line-argument]
make: *** [makefile:10: main.o] Error 1
Если убрать флаг -lcs50 или изменить компилятор на gcc в строке:
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
программа нормально компилируется и запускается. Объясните пожалуйста, в чем проблема с gcc, и почему clang не компилирует объектные файлы с флагом -lcs50
Вот с таким makefile все работает:
SRCS = main.c
OBJS = $(SRCS:.c=.o)
CFLAGS = -lcs50 -Wall -Wextra -Werror
TARGET = main
CC = clang
all: $(TARGET)
.c.o:
$(CC) -Wall -Wextra -Werror -c $< -o $@
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
clean:
rm -rf ./*.o
fclean:
rm -rf $(TARGET) *.o
re: fclean all
Еще вопрос, нужны ли вообще флаги при создании объектных файлов:
.c.o:
$(CC) -Wall -Wextra -Werror -c $< -o $@
Учиться только начинаю, поэтому если проблема глупая, заранее прошу прощения.
Ответы (1 шт):
Вопрос решен после настройки Makefile:
SRCS = main.c sigma-1.c swap.c
OBJS = $(SRCS:.c=.o)
CFLAGS = -Wall -Wextra -Werror
LDLIBS = -lcs50 -lm
TARGET = main
CC = gcc
all: $(TARGET)
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
$(TARGET): $(OBJS)
$(CC) -o $(TARGET) $(OBJS) $(LDLIBS)
clean:
rm -rf ./*.o
fclean:
rm -rf $(TARGET) *.o
re: fclean all
Спасибо @StanislavVolodarskiy