使用makefile

时间:2016-02-08 03:09:41

标签: gcc makefile linker arm undefined-reference

我正在学习GCC,并在运行make时遇到一些未定义的引用错误。我正在使用一个我没有创建的makefile,但是在对这些未定义的引用错误进行故障排除时,我浏览了makefile的每一行以了解发生了什么并尝试修复问题但是虽然我确实学到了很多东西但是没有成功makefile中使用的语法。

使用make:

时,这是未定义的引用输出
/usr/bin/arm-none-eabi-gcc -O0 -g -mcpu=cortex-m3 -mthumb  -I/home/np/STMBook -I/home/np/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x -I/home/np/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport -I/home/np/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc -I. -DSTM32F10X_MD_VL  -DUSE_STDPERIPH_DRIVER -DUSE_FULL_ASSERT  -I/home/np/STMBook/Library/ff9/src -I/home/np/STMBook/Library  -T/home/np/STMBook/stm32f100.ld -mthumb -mcpu=cortex-m3   BlinkLight.c   -o BlinkLight
/usr/lib/gcc/arm-none-eabi/4.8.2/../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol Reset_Handler; defaulting to 08000000
/tmp/ccZbJmMi.o: In function `main':
/home/np/STMBook/BlinkLight.c:11: undefined reference to `RCC_APB2PeriphClockCmd'
/home/np/STMBook/BlinkLight.c:14: undefined reference to `GPIO_StructInit'
/home/np/STMBook/BlinkLight.c:18: undefined reference to `GPIO_Init'
/home/np/STMBook/BlinkLight.c:21: undefined reference to `SystemCoreClock'
/home/np/STMBook/BlinkLight.c:21: undefined reference to `SystemCoreClock'
/home/np/STMBook/BlinkLight.c:30: undefined reference to `GPIO_WriteBit'
collect2: error: ld returned 1 exit status
make: *** [BlinkLight] Error 1

这是我的makefile,它有两个部分:

第1部分:

TEMPLATEROOT = /home/np/STMBook

# compilation flags for gdb

CFLAGS  += -O0 -g
ASFLAGS += -g

# object files

OBJS=   $(STARTUP) BlinkLight.o 
OBJS+=  stm32f10x_gpio.o stm32f10x_rcc.o

# include common make file

include $(TEMPLATEROOT)/Makefile.common

第2部分(makefile.common):

# name of executable

ELF=$(notdir $(CURDIR)).elf                    

# Tool path

TOOLROOT=/usr/bin

# Library path    

LIBROOT=/home/np/STM32F10x_StdPeriph_Lib_V3.5.0

# Tools      

CC=$(TOOLROOT)/arm-none-eabi-gcc
LD=$(TOOLROOT)/arm-none-eabi-gcc
AR=$(TOOLROOT)/arm-none-eabi-ar
AS=$(TOOLROOT)/arm-none-eabi-as

# Code Paths

DEVICE=$(LIBROOT)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x
CORE=$(LIBROOT)/Libraries/CMSIS/CM3/CoreSupport
PERIPH=$(LIBROOT)/Libraries/STM32F10x_StdPeriph_Driver

# Search path for standard files

vpath %.c $(TEMPLATEROOT)

# Search path for perpheral library

vpath %.c $(CORE)
vpath %.c $(PERIPH)/src
vpath %.c $(DEVICE)

# Search path for Library

vpath %.c $(TEMPLATEROOT)/Library/ff9/src
vpath %.c $(TEMPLATEROOT)/Library/ff9/src/option
vpath %.c $(TEMPLATEROOT)/Library

#  Processor specific

PTYPE = STM32F10X_MD_VL 
LDSCRIPT = $(TEMPLATEROOT)/stm32f100.ld
STARTUP= startup_stm32f10x.o system_stm32f10x.o 

# Compilation Flags

FULLASSERT = -DUSE_FULL_ASSERT 

LDFLAGS+= -T$(LDSCRIPT) -mthumb -mcpu=cortex-m3 
CFLAGS+= -mcpu=cortex-m3 -mthumb 
CFLAGS+= -I$(TEMPLATEROOT) -I$(DEVICE) -I$(CORE) -I$(PERIPH)/inc -I.
CFLAGS+= -D$(PTYPE) -DUSE_STDPERIPH_DRIVER $(FULLASSERT)
CFLAGS+= -I$(TEMPLATEROOT)/Library/ff9/src -I$(TEMPLATEROOT)/Library

# Build executable 

$(ELF) : $(OBJS)
    $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

# compile and generate dependency info

%.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@
    $(CC) -MM $(CFLAGS) $< > $*.d

%.o: %.s
    $(CC) -c $(CFLAGS) $< -o $@

clean:
    rm -f $(OBJS) $(OBJS:.o=.d) $(ELF) startup_stm32f* $(CLEANOTHER)

debug: $(ELF)
    arm-none-eabi-gdb $(ELF)


# pull in dependencies

    -include $(OBJS:.o=.d)

以下是我的理解:

未定义的引用包含在文件stm32f10x_gpio.c(GPIO未定义引用)和stm32f10x_rcc.c(RCC未定义引用)中,并且这些引用在makefile的第1部分的OBJS变量中声明为必需对象:

OBJS=   $(STARTUP) BlinkLight.o 
OBJS+=  stm32f10x_gpio.o stm32f10x_rcc.o

未定义的引用'SystemCoreClock'位于makefile中给出的目录中的system_stm32f10x.c文件中:

STARTUP= startup_stm32f10x.o system_stm32f10x.o

并包含在OBJS变量中。

用于编译所需对象的.c文件的路径在makefile中定义:

stm32f10x_gpio.c和stm32f10x_rcc.c的位置:

vpath %.c $(PERIPH)/src

system_stm32f10x.c的位置:

vpath %.c $(DEVICE)

包含未定义引用的所有必需对象都作为变量OBJS传递给目标构建指令:

$(ELF) : $(OBJS)
    $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

makefile中还包含有关如何从C源文件中获取目标文件的构建说明:

%.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@
    $(CC) -MM $(CFLAGS) $< > $*.d

我不明白为什么看起来无法找到C源文件。谢谢你的任何建议,我真的很感激任何帮助。

很抱歉,我的帖子很长,我试着浏览makefile的每一行并研究所有的符号和语法来自行解决问题并浏览了本网站上的许多未定义的参考问题但是没弄明白。

0 个答案:

没有答案