0

わずかに異なる 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リストにありますか?何が起きてる??

4

1 に答える 1

1

Makeようなコマンド$(info)は、makefile が読み込まれるとすぐに評価されます。そのため、 の「グローバル」値が表示され$(SRC)ます。

オブジェクトファイルを含まないリンクの問題は、ファイルがロードされるときに依存関係「評価」されることです。これは、allターゲットに対してOBJ、ファイルがロードされたときと同じように依存関係が設定されることを意味します。

于 2013-07-05T13:43:02.233 に答える