#c #object #makefile #nosuchfile
Вопрос:
У меня есть SDK с некоторыми примерами, но когда я хочу скомпилировать любой из этих примеров, я получаю эту ошибку:
cc -g -I -o this_example.o -c this_example.c
cc: error: this_example.o: No such file or directory
make: *** [Makefile:15: this_example.o] Error 1
Вот файл makefile:
CC ?= gcc INC_PATH ?= $(realpath ../inc) LIB_PATH ?= $(realpath ../lib) LIBS ?= $(wildcard $(LIB_PATH)/*.a) -pthread -lrt -lm LDFLAGS :=-g -L$(LIB_PATH) CFLAGS =-g -I$(INC_PATH) EXAMPLES=sdk_this_example_folder .PHONY: all all: $(EXAMPLES) %.o: %.c $(CC) $(CFLAGS) -o $@ -c
lt;
this_example: this_example.o frozen.o
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) -Wl,-rpath,'$ORIGIN/../../lib'clean:
rm -f *~ *.o $(EXAMPLES)
В папке this_example_folder у меня четыре файла: Makefile, this_example.c и замороженный.c и замороженный.h. В чем проблема? Спасибо всем вам за вашу помощь!
Ответ №1:
realpath
Функция возвращает пустую строку, если путь, который вы расширяете, не существует.
У тебя есть:
INC_PATH ?= $(realpath ../inc)
затем:
CFLAGS =-g -I$(INC_PATH)
и вывод вашей команды:
cc -g -I -o this_example.o -c this_example.c
Очевидно, что значение INC_PATH
пусто (так как после -I
в командной строке ничего нет), что означает, что каталог ../inc
не существует.
Что касается причины, по которой вы получаете этот сбой: -I
опция ожидает, что после этого появится имя файла. Поскольку у вас его нет, он использует -o
(следующее слово в командной строке) в качестве имени файла. Это означает, что this_example.o
он рассматривается как файл для компиляции, а не как выходной файл, и, конечно, его не существует.