わずかに異なる 2 つのバージョンの C コードを 1 つの Makefile でコンパイルしたいと考えています。
基本的に、いくつかのフラグといくつかのソース ファイルを追加するだけです。
現在、ソースリストの定義があります:
SRC := <adding stuff>
それから私のオブジェクトを生成します:
OBJ = $(SRC:%.c=$(OBJS_DIR)/%.o) $(ASRC:%.s=$(OBJS_DIR)/%.o)
「all」ターゲットは正常にコンパイルされ、「iomodule」ターゲットは変数を変更して「all」を呼び出します。
.PHONY: iomodule
iomodule: CDEFS := $(subst -DFD_MODULE, -DIO_MODULE, $(CDEFS))
#iomodule: SRC += $(subst $(SRC_DIR)/,,$(wildcard $(SRC_DIR)/iomod*.c))
iomodule: SRC += iomod_ring_proto.c
iomodule: OBJ += $(OBJ_DIR)/iomod_ring_proto.o
#iomodule: $(info $(SRC))
iomodule: all
all: dirs STM32F100RB_FLASH.ld $(OBJ)
$(CC) -o $(TARGET).elf $(LDFLAGS) $(OBJ) $(LDLIBS)
$(OBJCOPY) -O ihex $(TARGET).elf $(TARGET).hex
$(OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin
「info」は「iomod_ring_proto.c」を含む SRC を出力し、OBJ は再帰変数であるため、*.o ファイルを含むと予想していました。
奇妙なことに、「info」はファイルなしでリストを出力し、「iomod_ring_proto.c」はコンパイルされません。それでも、「objs/iomod_ring_proto.o」が見つからないというリンカ エラーが発生します。それで、それを印刷するときはSRCリストになく、コンパイルするときはOBJリストにありませんが、リンクするときはOBJリストにありますか?何が起きてる??