2

チュートリアルから作成しようとした次のメイクファイルがあります。次に、コードに合わせて必要なソースを追加しました..しかし、ターゲットが見つかりません。ソースのフォルダ構造に関係していると思いますが、わかりません。

SVN_REV=(svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]')

DEBUG_OPTS:=-g  -DSVN_REV \
            -DDEBUG_MODE \
            -UTIME_MODE \
            -UREADFROMFILE 

CFLAGS:=$(DEBUG_OPTS) -c -Wall 
LDFLAGS:=$(DEBUG_OPTS) -lpthread 

EXECUTABLE:=fw_board
COMPILER:=arm-linux-gcc

(makefile は以下に続きます。TOPDIR から見た src ファイルの場所があります)

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.
4

2 に答える 2

3

ソースをすべての依存関係としてリストしないでください。

all: $(EXECUTABLE) に依存します。ちなみに、エコーは $(EXECUTABLE) がビルドされた後にのみ出力されます (あったとしても)。

$(EXECUTABLE): $(OBJECTS) に依存

$(OBJECTS) ルールの構文が何をしているのかよくわかりませんが、$(OBJECTS) に明示的なルールを設定する必要はありません。$(OBJECTS) ですべてのオブジェクト ファイルを一覧表示し、C ファイルからそれらを生成するルールを設定するだけで十分です。

これらすべてのルールでは、「all:」はとにかくソースに暗黙的に依存しています。また、「all:」は「偽の」ルールなので、とにかく毎回すべての依存関係を再構築します。

パス main_process/main.c は、makefile を含むディレクトリに対して相対的に存在する必要があります。

それをすべて修正すれば、準備完了です。

于 2011-09-22T14:27:12.177 に答える