.o文件中的未定义符号

时间:2016-12-06 09:56:15

标签: c assembly embedded microcontroller 68hc12

我正在使用icc12制作一个包含三个文件的项目:

.s文件,包含汇编语言

中的一系列子例程

.h文件,包含函数列表

.c程序包含我的主代码,我调用我的子程序

我的问题是,当我编译C程序时,编译器会显示以下错误:

 !ERROR file 'filename.o': undefined symbol '_lcd_putstr'
 !ERROR file 'filename.o': undefined symbol '_lcd_init'
 !ERROR file 'filename.o': undefined symbol '_lcd_move'
 !ERROR file 'filename.o': undefined symbol '_lcd_clear'

我一直在研究.o文件实际上是什么,我知道它是一个包含CPU理解的机器代码的目标文件。它们包含的信息允许链接器查看工作所需的符号。我仍然不明白如何解决这些错误。我检查过任何语法错误,但我似乎无法找到任何错误。是否有人能够提供一些帮助,告诉我如何制作这些符号'定义'在我的.o文件中?

我的构建命令是

 #include <stdio.h>
 #include <mc9s12dp512.h>
 #include "lcd.h"

 int main (void)
 {
      unsigned char keycode;
      int keysave = 0;

      DDRB = 0x00;    /* make Port B an input port */

      lcd_init();  // initialise the lcd module
      lcd_clear(); // clear the lcd module

      // print the welcome message on the LCD module
      lcd_putstr(" message A ");

      // move the cursor position down a line
      lcd_move(1,1);
      lcd_putstr(" message B ");

      // move the cursor position down a line
      lcd_move(1,2);
      lcd_putstr(" message C ");

      // move the cursor position down a line
      lcd_move(1,3);
      lcd_putstr(" message D ");

摘自_lcd_putstr

的汇编文件
 _lcd_putstr::
             pshx
             tfr     d,x             ; Transfer address of string to X
             ldaa    #WRDATA         ; Set up command for write data
             jsr     WriteBytes      ; Call subroutine to write byte to LCD
             pulx
             rts

1 个答案:

答案 0 :(得分:1)

通常,编译在编译c源时会在标识符前面加下划线。如果您的编译器这样做,您必须将下划线添加到汇编程序文件中的子例程名称,并在.h文件中省略它,例如:

汇编程序文件中的名称:_lcd_putstr

.h文件中的原型:int lcd_putstr(void);

在.c文件中使用:n= lcd_putstr();

<小时/> 编辑:

  

&#34;当我编译我的C程序时,编译器显示以下错误[...]&#34;

您向我们展示的错误不是编译器错误。它们是链接器错误。 C文件被编译为.o文件。所有需要的.o和lib文件都由链接器组合成一个可执行文件。正是在这个阶段产生了错误消息:链接器无法找到这些符号。

您必须指示编译器生成.o文件。然后,您必须发出命令将对象链接到可执行文件中。您似乎没有或没有发出此命令。请参阅开发工具的文档,了解如何发出包含所有必需对象的链接命令。