3

次の vpath を使用して、$(OBJ) ファイルを見つけようとしています。

vpath %.o ./lib/obj

そして、私のターゲットは次のように設定されています:

# Link target
link:
    @echo "\nLinking files"
    $(CC) $(LINK_FLAGS) -o main.elf $(OBJS)

出力を見ると、(すべての *.o ファイルについて)次のようになります。

...error: misc.o: No such file or directory

私のプロジェクト構造は次のようになります。

.
├── Makefile
├── inc
│   └── main.h
├── lib
│   ├── inc
│   │   ├── cmsis
│   │   │   ├── arm_common_tables.h
│   │   │   ├── ...
│   │   ├── peripherals
│   │   │   ├── misc.h
│   │   │   ├── ...
│   │   └── stm32f4xx
│   │       ├── stm32f4xx.h
│   │       ├── ...
│   ├── obj
│   │   ├── misc.o
│   ├── src
│   │   ├── peripherals
│   │   │   ├── misc.c
│   │   │   ├── ...
│   │   └── system_stm32f4xx.c
│   └── startup_stm32f4xx.s
├── src
│   └── main.c
└── stm32f4.ld

.o ファイルが見つからないのはなぜですか?

参照用の完全な出力:

arm-none-eabi-gcc -T"stm32f3.ld" -nostartfiles -Wl,-Map,"main.map" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -L"./" -o main .elf misc.o stm32f4xx_adc.o stm32f4xx_can.o stm32f4xx_crc.o stm32f4xx_cryp.o stm32f4xx_cryp_aes.o stm32f4xx_cryp_des.o stm32f4xx_cryp_tdes.o stm32f4xx_dac.o stm32f4xx_dbgmcu.o stm32f4xx_dcmi.o stm32f4xx_dma.o stm32f4xx_exti.o stm32f4xx_flash.o stm32f4xx_fsmc.o stm32f4xx_gpio.o stm32f4xx_hash.o stm32f4xx_hash_md5.o stm32f4xx_hash_sha1.o stm32f4xx_i2c.o stm32f4xx_iwdg.o stm32f4xx_pwr.o stm32f4xx_rcc.o stm32f4xx_rng.o stm32f4xx_rtc.o stm32f4xx_sdio.o stm32f4xx_spi.o stm32f4xx_syscfg.o stm32f4xx_tim.o stm32f4xx_usart.o stm32f4xx_wwdg.o system_stm32f4xx.o

4

4 に答える 4

5

他の答えは彼らの言うことの詳細では正しいですが、ここにはもっと大きなポイントがあります: VPATH/vpath を使用して、makefile からビルドした .o ファイルなどの派生ファイルを確実に見つけることはできません。VPATH/vpath は、.c ファイルなどのソースファイルを検索する場合にのみ役立ちます。

http://make.mad-scientist.net/vpath.htmlを読む必要があります

于 2013-02-27T12:21:25.893 に答える
5

$(OBJS)は単なる変数であり、テキストとして展開されます。linkルール内のコマンドのテキストに表示される場合、単純にテキストとして展開されます。

vpath検索は Prerequisites に適用されるため、 がリンク ルールの前提$(OBJS)条件として表示されるようにし、ルールのコマンドがそれらの前提条件$(OBJS)を (直接使用するのではなく、自動変数を介して) 使用するように調整する必要があります。

したがって、ルールはより似ている必要があります

# Link target
link: main.elf

main.elf: $(OBJS)
    @echo "\nLinking files"
    $(CC) $(LINK_FLAGS) -o $@ $+

(生成されたファイル ( main.elf ) を、中間ルールの非偽のターゲットとして自由に書き出すこともできます。これらを Make に対して明示的にすることは、一般的には良い考えです。)

于 2013-02-26T21:27:11.347 に答える
3

vpathコンパイラ/リンカーではなく、ファイルを見つける場所をmakeに伝えるだけです。コンパイラ/リンカーにそれらが見つかった場所を伝えるには、make を取得する必要があります。最も簡単な方法は、それらを適切な依存関係にして (リンクする前に再構築されるようにする)、次を使用すること$^です。

# Link target
link: $(OBJS)
        @echo "\nLinking files"
        $(CC) $(LINK_FLAGS) -o main.elf $^
于 2013-02-26T21:27:27.523 に答える
1

Makefile に以下を追加しました。

OBJS = $(LIB_SRC:.c=.o)
OBJ_FILES = $(addprefix lib/out/,$(notdir $(LIB_SRC:.c=.o)))

ターゲットを更新しました:

link:
    @echo "\nLinking files"
    $(CC) $(LINK_FLAGS) -o main.elf $(OBJ_FILES)

リンカが .o ファイルを正しく検出するようになりました。

于 2013-02-27T08:36:08.593 に答える