make не находит правила для создания цели (новичок в создании make-файлов вручную) - PullRequest
2 голосов
/ 22 сентября 2011

У меня есть следующий make-файл, который я пытался создать из учебника.Затем я (подумал) я добавил необходимые источники, чтобы подогнать его под мой код ... но он не находит цель.Я думаю, что это может быть связано со структурой папок источников, но я не могу понять это.TOPDIR)

SOURCES:=main_process/main.c \
      ezxml/ezxml.c \
      info_file_parser/info_file_parser.c \
      info_file_parser/array_management.c \
      info_file_parser/protocol_file_parser.c \
      info_file_parser/sequence_file_parser.c \
      info_file_parser/topology_file_parser.c \
      seq_exec_module/seq_execution.c \
      i2c_device_drivers/pca950x.c \
      i2c_device_drivers/ltc2495.c \
      i2c_device_drivers/ltc2609.c \
      i2c_device_drivers/temperature_uc.c \
      i2c_device_drivers/pcf8574.c \
      i2c_device_drivers/stepper_motor_control.c \
      i2c_device_drivers/test_functions.c \
      i2c_device_drivers/stepper_pca.c \
      i2c_device_drivers/stepper_atmega.c \
      i2c_device_drivers/general_i2c.c \
      i2c_device_drivers/zx_mbd_pwr.c \
      i2c_device_drivers/virtual_switch_handler.c \
      i2c_device_drivers/pressure_sensor_ASDXAV030PG7A5.c \
      hashing/ConfigData.c \
      hashing/Hash.c \
      hashing/LinkedList.c \
      init_file_parser/init_file_parser.c \
      usb_communication/serial_comm.c \
      protocol_parser/protocol_parser.c 


BINDIR:=bin
OBJDIR:=.obj
OBJECTS:=$(addprefix $(OBJDIR)/,$(SOURCES:%.c=%.o))

.PHONY: all
all: $(SOURCES) $(EXECUTABLE)
    @echo all_start

это этап связывания

$(EXECUTABLE): $(OBJECTS) | $(BINDIR)
    @echo link
    $(COMPILER) $(LDFLAGS) $(OBJECTS) -o $(BINDIR)/$@

и этап компиляции.но файл main.c не может быть найден, поскольку вы увидите, что

$(OBJECTS): $(OBJDIR)/%.o : %.c | $(OBJDIR)
    @echo compile
    $(COMPILER) $(CFLAGS) $< -o $@

$(OBJDIR):
    mkdir $(OBJDIR)

$(BINDIR):
    mkdir $(BINDIR)

.PHONY: clean
clean:
    @echo removing_files
    rm -rf $(OBJECTS) $(BINDIR)/$(EXECUTABLE)

при запуске make возвращает следующее:

make: *** No rule to make target `main_process/main.c', needed by `all'.  Stop.

Ответы [ 2 ]

3 голосов
/ 22 сентября 2011

Не перечислять источники как зависимость всех.

все: зависит от $ (EXECUTABLE). Между прочим, эхо будет только выводить (если вообще будет) ПОСЛЕ $ (EXECUTABLE) было построено.

$ (EXECUTABLE): зависит от $ (OBJECTS)

Я не совсем уверен, что делает синтаксис в вашем правиле $ (OBJECTS), но нет необходимости иметь явное правило для $ (OBJECTS). Достаточно иметь в списке $ (OBJECTS) все объектные файлы, а затем иметь правило для их генерации из файлов C. Достаточно.

При всех этих правилах "все:" все равно косвенно зависит от источников. Кроме того, «all:» является «поддельным» правилом, поэтому в любом случае будет перестраивать все зависимости каждый раз.

Путь main_process / main.c должен существовать относительно каталога, содержащего make-файл.

Исправьте все это, и вы должны быть в порядке.

0 голосов
/ 22 сентября 2011

Я не могу понять, где именно ваша марка пошла не так, без большой информации о вашей среде сборки, но ваши лучшие ставки:

  1. Используйте make -d, чтобы показать вам, где что-то пошло не так,Если вы не используете неявные правила, make -rd более лаконичен.
  2. Используйте automake, чтобы вообще не писать Makefile.

В принципе, если есть такая вещькак файл main_process / main.c, он должен быть скомпилирован.Вы пробовали ls с точно таким же именем?

...