Выход make
выглядит следующим образомМой Makefile пытается создать каталог,
gcc -Wall -Wextra -std=c99 -o bin/test src/obj/ src/obj/main.o src/obj/test.o
/usr/bin/ld: cannot find src/obj/: File format not recognized
collect2: error: ld returned 1 exit status
make: *** [test] Error 1
Как вы можете видеть, выполняется команда компиляции пытается скомпилировать Src/как файл/объект объекта. Мое лучшее предположение заключается в том, что как-то он был указан в переменной OBJ.
EDIT: Это рабочий файл. После некоторой отладки я сделал следующие изменения.
Это не работает. К тому времени, когда они были скомпилированы, все пути к файлам были перепутаны. Так это ...
# object directory
OBJ_DIR=$(SRC_DIR)/obj
# souce files
SRC=$(wildcard $(SRC_DIR)/*.c)
# object files
OBJ=$(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRC)) # still directories in OBJ list causing problems
стал этим ...
# object directory
OBJ_DIR=obj
# souce files
SRC=$(patsubst $(SRC_DIR)/%.c,%.c,$(wildcard $(SRC_DIR)/*.c))
# object files
OBJ=$(patsubst %.c,%.o,$(SRC))
и это ...
# rule that individual objects rely on .c versions and .h files
# needs to compile to .o files, then compile to executable
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(DEPS)
$(CC) -c -o [email protected] $< $(CFLAGS)
# actual compile commands
$(PROJ_NAME): $(OBJ_DIR)/$(OBJ)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJ_DIR)/$(OBJ)
стал этим ...
# rule that individual objects rely on .c versions and .h files
# needs to compile to .o files, then compile to executable
%.o: $(SRC_DIR)/%.c $(DEPS)
$(CC) -c -o [email protected] $< $(CFLAGS)
# actual compile commands
$(PROJ_NAME): $(SRC_DIR)/$(OBJ_DIR)/$(OBJ)
$(CC) $(CFLAGS) -o $(TARGET) $(SRC_DIR)/$(OBJ_DIR)/$(OBJ)
По существу , используя patsubst
I убедитесь, что все файлы в списке не имеют пути к ним, а затем вручную задали полный путь, когда это необходимо.
Используйте [remake] (http://bashdb.sourceforge.net/remake/) как 'remake -x' или' make -trace', чтобы понять, что происходит (при условии GNU make & Linux). –