cc: ошибка: this_example.o: Такого файла или каталога нет

#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 он рассматривается как файл для компиляции, а не как выходной файл, и, конечно, его не существует.