2013-02-26 2 views
3

Я использую следующий VPATH попытаться размещения мои $ (OBJ) файлов:Makefile VPATH% .o не находя 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 не найдены?

Полный выход для справки:

рычажного ни-EABI-GCC -T "stm32f3.ld" -nostartfiles -Wl, -Map, "main.map" -mcpu = кортекс-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 stm32f4 xx_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

ответ

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.

+0

Да, это был бы утомительный способ сделать это вручную. Как указал Крис, вы хотите, чтобы объектные файлы соответствовали соответствующим правилам ссылки (чтобы они были перестроены, когда это необходимо, это большая часть использования make!). В этот момент вы также можете сделать это правильно и сделать это с помощью 'vpath' /' $ + ', воспользовавшись предпосылками, которые у вас есть. –

5

$(OBJS) это просто переменная , и расширяется как текст. Когда он появляется в тексте команды в вашем правиле link, он просто расширяется как текст.

vpath поиски применяются к предпосылок, так что вам придется организовать для $(OBJS) выступать в качестве предпосылок для этого правила связи и для команд создания правила для use those prerequisites (с помощью автоматических переменных, а не только с помощью $(OBJS) напрямую).

Так ваше правило должно выглядеть как

# Link target 
link: main.elf 

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

(я также взял на себя смелость выписывая файл, сгенерированный (main.elf) как не-фальшивой цели промежуточного правила. Сделать эти вещи явными для Make, как правило, хорошая идея.)

+0

Я все еще получаю тот же результат, как и мой вопрос, он не решает, например, misc.o к ./lib/out/misc.o –

+1

@josef: Предположительно вы пренебрегли измените строку '$ (CC) ...', чтобы использовать автоматическую переменную ('$ +' или '$ ^'), содержащую разрешенные имена предварительных условий. Как отмечено в [документации, на которой я указал вас] (http://www.gnu.org/software/make/manual/html_node/Recipes_002fSearch.html), это очень важно. –

3

vpath просто сообщает, где искать файлы, а не компилятор/компоновщик. Вы должны заставить make сообщать компилятору/компоновщику, где он их нашел.Самый простой способ, чтобы сделать их соответствующие зависимости (таким образом они получают перестроен перед соединением), а затем использовать $^:

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

Я все еще получаю тот же результат, что и с моим вопросом, он не разрешает, например, misc.o ./lib/out/misc.o –

4

Хотя другие правильные ответы в детали того, что они говорят, есть большая точка здесь: это не представляется возможным использовать VPATH/VPATH надежно найти полученные файлы, как .o файлы, которые вы строите из ваш файл. VPATH/vpath is только полезный для поиска источник файлы, такие как .c файлы.

Вы должны прочитать http://make.mad-scientist.net/vpath.html

Смежные вопросы