将多个对象文件链接到二进制AVR GCC

将多个对象文件链接到二进制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);

我有以下标题和源文件:

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);
// 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)一切都好吗?我对这个地图文件还不太了解……但在我学习之前,至少要知道我正确地拥有它:)