将多个对象文件链接到二进制AVR GCC
我有以下标题和源文件: AVR_通信公司将多个对象文件链接到二进制AVR GCC,c,batch-file,linker,embedded,avr-gcc,C,Batch File,Linker,Embedded,Avr Gcc,我有以下标题和源文件: AVR_通信公司 #ifndef AVR_COMUNIC_H_ #define AVR_COMUNIC_H_ #include<avr/io.h> #define FOSC 20000000UL // Clock Speed #define BAUD 19200 #define MYUBRR FOSC/16/BAUD-1 void USART_Init( unsigned int); int USART_WriteChar(unsigned char);
#ifndef AVR_COMUNIC_H_
#define AVR_COMUNIC_H_
#include<avr/io.h>
#define FOSC 20000000UL // Clock Speed
#define BAUD 19200
#define MYUBRR FOSC/16/BAUD-1
void USART_Init( unsigned int);
int USART_WriteChar(unsigned char);
// int USART_Receive( unsigned char *);
void USART_Flush(void);
#endif /* AVR_COMUNIC_H_ */
和主燃料电池
#include"AVR_comunic.h"
void init_ports()
{
DDRD|= (1<<PD7);
}
int main(void)
{
init_ports();
...
while(1)
{
// now what?
}
return 1;
}
我得到以下错误:
... : undefined reference to 'main'
avr-objcopy: 'AVR_comunic.elf' no such file
我从互联网上的信息了解到,链接者确实认为没有“主要”功能。。。但它是。。。我做错了什么?或者我应该如何编写来编译多个源文件
我从互联网上的信息了解到,链接者确实认为没有“主要”功能。。。但它是。。。我做错了什么
此命令:
avr-objdump -h -S AVR_comunic.elf > AVR_comunic.lst
avr-gcc -g -mmcu=atmega8 -Wl,-Map,AVR_comunic.map -o AVR_comunic.elf AVR_comunic.o
试图从尚未生成的AVR_communic.elf中提取信息。要在执行此命令后移动它:
avr-objdump -h -S AVR_comunic.elf > AVR_comunic.lst
avr-gcc -g -mmcu=atmega8 -Wl,-Map,AVR_comunic.map -o AVR_comunic.elf AVR_comunic.o
由于未将main\u f.o
链接到main\u f.o,上述命令因未定义对“main”的引用而失败
看来你真正想要的是:
avr-gcc -g -mmcu=atmega88p -o AVR_communic.elf main_f.o AVR_comunic.o
avr-objdump -h -S AVR_comunic.elf > AVR_comunic.lst
avr-objcopy -j .text -j .data -O ihex AVR_comunic.elf AVR_comunic.hex
avr objdump
需要在avr gcc之后-o AVR_comunic.elf
因为这就是创建AVR_comunic.elf的原因。第二,为什么不使用main\u f.elf
,因为在这里main
应该是对象的一部分。我也不知道AVR\u comunic.elf
如何包含main
,因为它是唯一的对象文件AVR\u comunic.o
。我建议使用带有自动生成文件的IDE。如果添加库,C文件将自动编译和链接它们。批处理文件不用于生成目标。如果出于某些奇怪的原因,您不想将Atmel studio或eclipse与avr插件一起使用-了解make
@PeterJ_01我将eclipse IDE与avr插件一起使用,但这里有人提到了一些链接器脚本(我从未做过类似的事情)我想也许我应该在编译和链接方面稍微舒服一点……先生,非常感谢您的回答。我已经修改了我的代码,但正如您所看到的,我得到了相同(类似)的错误。@CMarius这是因为您不能按照简单的说明操作。特别是,您将中断的命令保留在中,而不是将其删除。你有4次调用avr gcc
,最后一次调用是假的,应该删除。或者,我应该写:avr gcc-g-mmcu=atmega8-Wl,-Map,avr_comunic.Map-o avr_comunic.elf avr_comunic.o main_f.o
(我没有给出任何错误)@CMarius很抱歉我错过了-Wl,-Map,AVR\u communic.Map
参数。您可以将其添加到AVR gcc
的第三个调用(即链接行)中,并删除第四个调用。很抱歉继续评论…但是如果调用现在仍然是编写的(它现在已经编译了,因为我添加了main\f.o)一切都好吗?我对这个地图文件还不太了解……但在我学习之前,至少要知道我正确地拥有它:)