我为AVR32 32位微处理器之一继承了一个稍微复杂的C程序。
但是,我没有关于如何编译它的信息。我已经为它整理了一段时间的制作文件,但一直没有成功。希望有人能告诉我哪里出了问题。
基本上,我有一个项目结构,如下所示:
/
ControllerR3.c # This is the main program file
/FRAMEWORK
/DRIVERS
/ADC
adc.c
adc.h
/GPIO
gpio.c
gpio.h
{another 6 hardware drivers}
/SERVICES
/DELAY
delay.c
delay.h基本上,ControllerR3.c包括adc.h、gpio.h等,并调用在这些不同的头文件中原型化的函数。各种FRAMEWORK头中的实际函数实际上是在.c文件中定义的。
所有.h文件都封装在包含保护中:
#ifndef _USART_H_
#define _USART_H_
{snip header file contents}
#endif // _USART_H_现在,据我所知,我必须将各种.c文件编译成对象(.o)文件,然后调用链接器将所有对象文件合并到最后的可执行文件中(在本例中,它是一个.elf文件)。
因此,我写了一个小makefile:
CC = avr32-gcc
CFLAGS = -mpart=uc3a0512 -O1 -ffunction-sections -masm-addr-pseudos -g3 -Wall -c -std=gnu99
COMP_INC = -I"./FRAMEWORK/UTILS" \
-I"./FRAMEWORK/UTILS/PREPROCESSOR"
LIB_INC = -I"./FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE" \
-I"./FRAMEWORK/SERVICES/DELAY" \
-I"./FRAMEWORK/DRIVERS/USART" \
-I"./FRAMEWORK/DRIVERS/TC" \
-I"./FRAMEWORK/DRIVERS/SPI" \
-I"./FRAMEWORK/DRIVERS/PWM" \
-I"./FRAMEWORK/DRIVERS/PM" \
-I"./FRAMEWORK/DRIVERS/INTC" \
-I"./FRAMEWORK/DRIVERS/GPIO" \
-I"./FRAMEWORK/DRIVERS/FLASHC" \
-I"./FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER" \
-I"./FRAMEWORK/BOARDS" \
-I"./FRAMEWORK/DRIVERS/ADC"
DRIVER_PATH = ./FRAMEWORK/DRIVERS
all: libraries main
main:
$(CC) $(CFLAGS) $(COMP_INC) $(LIB_INC) -o"Debug/$@.o" "ControllerR3.c"
$(CC) "Debug/adc.o" "Debug/flashc.o" "Debug/gpio.o" "Debug/intc.o" "Debug/pm.o" "Debug/pwm.o" "Debug/tc.o" "Debug/usart.o" "Debug/spi.o" "Debug/main.o" "Debug/delay.o" \
-o Debug/CookerControlR3.elf
libraries: adc.c flashc.c gpio.c intc.c pm.c pwm.c spi.c tc.c usart.c delay.c
adc.c:
$(CC) $(CFLAGS) $(COMP_INC) -o"Debug/$*.o" "$(DRIVER_PATH)/ADC/$@"
flashc.c:
$(CC) $(CFLAGS) $(COMP_INC) -o"Debug/$*.o" "$(DRIVER_PATH)/FLASHC/$@"
gpio.c:
$(CC) $(CFLAGS) $(COMP_INC) -o"Debug/$*.o" "$(DRIVER_PATH)/GPIO/$@"
intc.c:
$(CC) $(CFLAGS) $(COMP_INC) -o"Debug/$*.o" "$(DRIVER_PATH)/INTC/$@"
pm.c:
$(CC) $(CFLAGS) $(COMP_INC) -o"Debug/$*.o" "$(DRIVER_PATH)/PM/$@"
pwm.c:
$(CC) $(CFLAGS) $(COMP_INC) -o"Debug/$*.o" "$(DRIVER_PATH)/PWM/$@"
spi.c:
$(CC) $(CFLAGS) $(COMP_INC) -o"Debug/$*.o" "$(DRIVER_PATH)/SPI/$@"
tc.c:
$(CC) $(CFLAGS) $(COMP_INC) -o"Debug/$*.o" "$(DRIVER_PATH)/TC/$@"
usart.c:
$(CC) $(CFLAGS) $(COMP_INC) -o"Debug/$*.o" "$(DRIVER_PATH)/USART/$@"
delay.c:
$(CC) $(CFLAGS) $(COMP_INC) -o"Debug/$*.o" -I"FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER" "FRAMEWORK/SERVICES/DELAY/$@"这成功地构建了所有不同的对象文件,然后在链接阶段失败:
C:\[snip - private]/./FRAMEWORK/DRIVERS/GPIO/gpio.h:507: multiple definition of `gpio_local_clr_gpio_open_drain_pin'
Debug/gpio.o:C:\[snip - private]/./FRAMEWORK/DRIVERS/GPIO/gpio.h:507: first defined here
Debug/main.o: In function `gpio_local_tgl_gpio_open_drain_pin':
C:\[snip - private]/./FRAMEWORK/DRIVERS/GPIO/gpio.h:525: multiple definition of `gpio_local_tgl_gpio_open_drain_pin'
Debug/gpio.o:C:\[snip - private]/./FRAMEWORK/DRIVERS/GPIO/gpio.h:525: first defined here
Debug/main.o: In function `usart_reset_status':
C:\[snip - private]/./FRAMEWORK/DRIVERS/USART/usart.h:409: multiple definition of `usart_reset_status'
Debug/usart.o:C:\[snip - private]/./FRAMEWORK/DRIVERS/USART/usart.h:409: first defined here
Debug/main.o: In function `usart_parity_error':
[snip a hundred or so lines]所以很明显,我对多个定义有问题。
在这一点上,我有点过头了。我对C开发没有太多的经验,只是想让makefile达到现在需要大量阅读的程度。
是什么导致了我这里的多重定义问题?为了防止这种情况,我需要对makefile进行哪些更改?
我知道这个项目是在过去成功建成的,因为我们有一个实际运行它的硬件设备。但是,我需要做一些修改,所以仅仅使用现有的编译版本就不再是可以接受的了。
现有的版本是由一个不再可用的外部承包商建造的,所以我不能真正地问他们是如何使它工作的。
发布于 2012-12-28 08:55:15
结果发现我用的是最近的IDE。
我在正确的IDE中打开了该项目(在本例中,是基于eclipse的Atmel avr32 studio的旧版本),它以某种方式自动推导出结构,并将所有内容正确地组合在一起。
无论如何,虽然不是我解决了这个问题,而是避免了它,但我把这个问题标记成了答案。我已经花了太多时间想弄清楚eclipse在做什么。
发布于 2012-09-17 13:01:30
看起来,您在头文件中实现了一个函数。当您编译object1和object2 (例如main.o和gpio.o)时,您的代码在这两个对象中都是重复的,这些代码不能链接在一起。
在这种情况下,我通常将函数的声明留在头文件中,并将其实现移动到一个对象代码中(不管是哪种代码)。
您能否确认在"gpio.h:507“中,您拥有该函数的实现而不仅仅是签名?
https://stackoverflow.com/questions/12459287
复制相似问题