2016-12-06 13 views
0

Я использую icc12, чтобы сделать проект, который содержит три файла:неопределенных символов в файле .o

.с файл, содержащий ряд подпрограмм на языке ассемблера

.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, и я понимаю, что это объектный файл, содержащий машинный код, который понимает ЦП. Они содержат информацию, которая позволяет компоновщику видеть, какие символы он требует для работы. Я все еще не понимаю, как я могу исправить эти ошибки, хотя из этого. Я проверил любые грамматические ошибки, но я не могу найти их. Кто-нибудь может предложить некоторую помощь в том, как я могу определить эти символы в моем файле .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 
+2

Пожалуйста, разместите свои команды сборки, а также укажите, где определены функции '_lcd_xxx' (т. Е. В каком исходном файле). –

+0

@PaulR мой исходный файл содержит все функции '_lcd_xxx' в языке ассемблера и определения функций.Все они объявлены в исходном файле с символом подчеркивания и сопровождаются двумя двоеточиями, например, '_lcd_putstr ::' . Мои команды сборки следующие: –

+0

. Нажмите ссылку [edit] выше, чтобы добавить дополнительную информацию к вашему вопросу (например, как команды сборки, соответствующий исходный код и т. д.), а не использование комментариев. –

ответ

0

Часто компиляции помещает подчеркивание перед идентификатором, когда он компилирует источник гр. Если ваш компилятор делает это, вы должны добавить подчеркивание в именах подпрограмм в ассемблерных файлах, и опустить его в файле .h, например:

Имя в ассемблере файле: _lcd_putstr

Prototype в файле .h : int lcd_putstr(void);

Использование в .c файле: n= lcd_putstr();


EDIT:

"при компиляции моей программы на языке C компилятор отображает следующие ошибки [...]"

Ошибки, которые вы нам показываете, не являются ошибками компилятора. Это ошибки компоновщика. Файл C скомпилирован в файл .o. Все requried файлы .o и lib объединяются компоновщиком в исполняемый файл. Именно на этом этапе генерируются сообщения об ошибках: компоновщик не может найти эти символы.

Вы должны указать своему компилятору сгенерировать файл .o. Затем вы должны выдать команду для связывания объектов в исполняемый файл. Кажется, у вас нет или нет этой команды. Пожалуйста, ознакомьтесь с документацией ваших средств разработки, как выпустить команду связи со всеми необходимыми объектами.

+0

жаль, что я никогда не упоминал, но у меня они набраны именно так, как вы их там, мои подпрограммы в файле .s имеют перед ними знак подчеркивания, и после этого у них есть два двоеточия. например .... '_lcd_putstr ::' –