Не удалось включить папку для компиляции C - PullRequest
0 голосов
/ 10 июня 2019

Все компилируется, если C находится во внешней папке, но когда lib.c находится в папке [lib], выдает ошибку: make: *** No rule to make target 'obj/lib.o', needed by 'run'. Stop.

Как исправить файл make, чтобы убедиться, что компиляцияуспешно?
Как правильно изменить make-файл?

Дерево такое:

 ├── inc
 │   └── main.h
 ├── lib
 │   └── lib.c
 ├── main.c
 ├── main_functions.sh
 ├── Makefile
 └── test_usages.c

Makefile:

# IDIR =../include \
This is a makefile \

IDIR =./inc
CC=gcc

ODIR=obj
# LIB_SRC_DIR =./lib
LDIR =./lib 
CFLAGS=-I $(IDIR) $(LDIR)   ## added $(LDIR)

# header files required
_DEPS = *.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_DEP_LIB = *.c                                  ##
DEPS_LIB = $(patsubst %,$(LDIR)/%,$(_DEP_LIB))  ##

_OBJ = lib.o main.o test_usages.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

 $(ODIR)/%.o: %.c $(DEPS) $(DEPS_LIB)       ## added $(DEPS_LIB)
     $(CC) -c -o $@ $< $(CFLAGS) 

 #%.o: %.c
 #      $(CC) $(CFLAGS) $(INCLUDES) -c $(input) -o $(output)

 # make commands options: make <options>, e.g. make hello_make  
 # executable name
 hello_make: $(OBJ)
     gcc -o $@ $^ $(CFLAGS)

 run: $(OBJ)
     gcc -o $@ $^ $(CFLAGS)
     echo "=========================================================="
     ./run
     echo "=========================================================="

 .PHONY: clean

 clean:
     echo "cleaning ...." $(ODIR)/*.o
     rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ ./*.exe

Заранее спасибо за совет.

1 Ответ

1 голос
/ 10 июня 2019

В вашем Makefile есть некоторые причуды, но вот как я заставил его работать:

  1. Удалите завершающий пробел в строке LDIR =./lib
  2. Вставьте VPATH=$(LDIR) в удобном месте

Теперь make -n run показывает (но не запускает) все ожидаемые командные строки:

gcc -c -o obj/lib.o ./lib/lib.c -I ./inc ./lib
gcc -c -o obj/main.o main.c -I ./inc ./lib
gcc -c -o obj/test_usages.o test_usages.c -I ./inc ./lib
gcc -o run obj/lib.o obj/main.o obj/test_usages.o -I ./inc ./lib
echo "=========================================================="
./run
echo "=========================================================="

Кстати, вы можете использовать эти опции для отладкиMakefile:

make -npr run выводить все переменные, правила и т. Д., Но не встроенные.

make -nd run выводить все решения, многие из них.

...