Что не так с моим make-файлом - PullRequest
1 голос
/ 16 января 2011
#####################################################################
# This is the filesystem makefile "make_BuddyAlloc".
# Author:Michael Gomes
# Date:2 jan 2011
######################################################################

#variable defination
CC = gcc
CFLAGS = -g -O2
SRC_DIR=src
INC_DIR=inc
OBJ_DIR=obj

#List of source files 
SOURCE= buddyMain.c \
  Copy.c \


#List of object files 
OBJECTS=$(addprefix $(OBJ_DIR)/,$(SOURCE:.c=.o))

#BuddyAlloc is dependent on "obj/*.o".
BuddyAlloc : $(OBJECTS)
 $(CC) $(CFLAGS) -o BuddyAlloc $<

#obj/*.o depends on src/*.c and inc/*.h, we are redirecting the object files to obj folder
$(OBJECTS):$(SRC_DIR)/$(SOURCE)  
 $(CC) $(CFLAGS) -I$(INC_DIR) -o $(OBJ_DIR)/$(OBJECTS) -c $<


#Cleans all the *.exe files
clean:
 rm -f *.exe

Я сохранил исходные файлы в папке src, включенной в папке inc, и объектные файлы сохраняются в папке obj. Приведенный выше файл makefile, который я пытаюсь создать для своего мини-проекта.Я продолжаю получать сообщение об ошибке без правила, чтобы сделать цель 'Copy.c' необходимой для 'obj / buddyAlloc.o', но она работает нормально, я не включаю Copy.c, что я сделал не так?

Ответы [ 2 ]

4 голосов
/ 16 января 2011

Эта строка - ваша проблема: $(OBJECTS):$(SRC_DIR)/$(SOURCE). Результирующая строка для зависимости (правая часть двоеточия) равна src/buddyMain.c Copy.c. Другими словами, вы пытаетесь добавить предшествующий каталог, но он добавляется только к первому файлу.

Существует множество способов исправить это:

  1. Ручной подход:

    SOURCE = $(SRC_DIR)/buddyMain.c $(SRC_DIR)/Copy.c

  2. VPATH, который добавляет каталоги в каждый путь поиска (см. http://www.gnu.org/software/make/manual/make.html#General-Search)

    VPATH = src

  3. Или, как уже используется в Makefile, используйте addprefix, чтобы ввести новую переменную построен из SOURCE:

    SRCS = $(addprefix $(SRC_DIR)/,$(SOURCE))

1 голос
/ 18 января 2011

В любом случае, вы используете GNUisms в вашем Makefile, так почему бы просто не использовать шаблонное правило?

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -I$(INC_DIR) -c -o $@ $<
...