реклама на сайте
подробности

 
 
> Как правильно создать многофайловый проект, Ошибка при линковке
alux
сообщение May 6 2007, 14:07
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Привет всем.
Создаю проект на IAR v.4.12A, состоящий из многих С-файлов. Проблема возникает при линковке в один файл. Если быть точнее, то при попытке вызова battery_charge(); из main возникает ошибка Error[e46]: Undefined external "FAST_charge" referred in bc ( IAR projects\pribor\Release\Obj\bc.r90 ). В main подключены хидеры всех используемых модулей, в том числе и bc.h :

///// main.c ////////
#include "bc.h"
...........
void main (void)
{
battery_charge();
}

//// bc.c /////
#include "bc.h"

void battery_charge(void)
{
FAST_charge();
}

///// bc.h ////////
extern void FAST_charge(void);
extern void TRICKLE_charge(void);
extern void battery_charge(void);

//// NiMh.c ////////
#include "NiMH.h"
void FAST_charge (void)
{
}


//// NiMh.h //////
void FAST_charge(void);

Помогите найти ошибку, пожалуйста. И расскажите популярно как создавать многофайловые проекты, а то все приходится делать методом научого тыка.

Сообщение отредактировал alux - May 6 2007, 14:40
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sKWO
сообщение Apr 13 2008, 10:55
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Добрый день!
Многофайловый проект, чёрт по.....
Подскажите, как обойти ошибку, извиняюсь что может быть повторяюсь.
Просто переопределения нигде не вижу, понимаю что чтото с включением файлов, пытался экстернить
но не помогло. Прикреплю проджект на всякий случай. Спросил на телесисах, но там молчок 05.gif
Error[e27]: Entry "EN" in module driver_lcd ( C:\Program Files\IAR Systems\test\testlsd\Debug\Obj\driver_lcd.r90 )
redefined in module main ( C:\Program Files\IAR Systems\test\testlsd\Debug\Obj\main.r90 )
ИАР версия 4.хх.
имею след код
файл bitdef.h
Код
#ifndef    BITDEF_H    
#define    BITDEF_H
#ifndef    BOOL_t  
#define    BOOL_t
typedef uint8_t bool_t;
#endif // BOOL_t
#ifndef    BitStr_t
#define    BitStr_t
typedef volatile uint8_t * port_t;
typedef struct{
  port_t Port;
  bool_t Bit;
}Port_Bit;
#endif // BitStr_t
#pragma inline=forced
void SETDDR(const Port_Bit * pb){
  *(pb->Port-1) |= 1 << pb->Bit;
}
#endif //BITDEF_H

файл driver_lcd.c
Код
#ifndef    driver_lcd_C  
#define    driver_lcd_C
#include "driver_lcd.h"
#include "delay.h"
// Команда на настройку выводов управления линиями управления ЖКИ на выход
void lcd_CMND_port_out(void)    {
                                        SETDDR(RW);\
                                        SETDDR(EN);\
                                        SETDDR(RS);\
                };
#endif //driver_lcd_C

файл driver_lcd.h
Код
#ifndef    driver_lcd_H
#define    driver_lcd_H
#include "bitdef.h"
// "E" Clock
Port_Bit dEN={&PORTB, 3};
const Port_Bit * EN = &dEN;
void lcd_CMND_port_out(void);
#endif //driver_lcd_H


Сообщение отредактировал sKWO - Apr 13 2008, 10:58
Прикрепленные файлы
Прикрепленный файл  testlsd.zip ( 25.62 килобайт ) Кол-во скачиваний: 25
 


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
alux
сообщение Apr 13 2008, 14:08
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(sKWO @ Apr 13 2008, 13:55) *
файл driver_lcd.h
Код
#ifndef    driver_lcd_H
#define    driver_lcd_H
#include "bitdef.h"
// "E" Clock
Port_Bit dEN={&PORTB, 3};   <<<<<<<<!!!!!!!!!!
const Port_Bit * EN = &dEN;   <<<<<<<<!!!!!!!!!!
#endif //driver_lcd_H

У вас в driver_lcd.h вынесено определение указателя EN. И это, естественно, является причиной переопределения. Нарушено правило одного определения. Перенесите определения в driver_lcd.с, а в driver_lcd.h объявите эти переменные с модификатором extern.

PS. Это же касается и других переменных.
И уберите обратные слеши в определении lcd_CMND_port_out. Они там ни к чему.

PS2. И
Код
#ifndef    driver_lcd_C  
#define    driver_lcd_C
...
... это лишнее.
Go to the top of the page
 
+Quote Post
sKWO
сообщение Apr 13 2008, 18:14
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(alux @ Apr 13 2008, 17:08) *
У вас в driver_lcd.h вынесено определение указателя EN. И это, естественно, является причиной переопределения. Нарушено правило одного определения. Перенесите определения в driver_lcd.с, а в driver_lcd.h объявите эти переменные с модификатором extern.

Спасибо добрый чел, а то как-то грустно было вместо файла driver_lcd.h в мейне подключать файл driver_lcd.c. Так компилится без ошибок. Поэтому и было
Код
#ifndef    driver_lcd_C  
#define    driver_lcd_C

smile.gif smile.gif smile.gif smile.gif
Сам знаю что не правильно, а с меня пиво beer.gif , щас программы нету под рукой но думаю что вопрос будет закрыт


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- alux   Как правильно создать многофайловый проект   May 6 2007, 14:07
- - jorikdima   хидеры то подключены, а в опциях проекта пути к ни...   May 6 2007, 14:20
|- - alux   Цитата(jorikdima @ May 6 2007, 17:20) хид...   May 6 2007, 14:46
||- - rezident   Цитата(alux @ May 6 2007, 20:46) Все файл...   May 6 2007, 18:25
|- - andrej2005   Цитата(jorikdima @ May 6 2007, 18:20) хид...   Apr 20 2008, 10:34
- - zltigo   Цитата(alux @ May 6 2007, 17:07) void bat...   May 6 2007, 14:24
- - SasaVitebsk   Простите, решил сюда добавить, чтобы темы не плоди...   Dec 9 2007, 19:06
|- - singlskv   Цитата(SasaVitebsk @ Dec 9 2007, 22:06) С...   Dec 9 2007, 20:22
|- - Сергей Борщ   Цитата(SasaVitebsk @ Dec 9 2007, 21:06) п...   Dec 9 2007, 21:56
|- - alexander55   Цитата(Сергей Борщ @ Dec 10 2007, 00:56) ...   Dec 11 2007, 06:17
|- - Сергей Борщ   Цитата(alexander55 @ Dec 11 2007, 08:17) ...   Dec 11 2007, 09:51
|- - alexander55   Цитата(Сергей Борщ @ Dec 11 2007, 12:51) ...   Dec 11 2007, 10:29
|- - Сергей Борщ   Цитата(alexander55 @ Dec 11 2007, 12:29) ...   Dec 11 2007, 13:07
|- - alexander55   Цитата(Сергей Борщ @ Dec 11 2007, 16:07) ...   Dec 11 2007, 13:39
|- - Сергей Борщ   Цитата(alexander55 @ Dec 11 2007, 15:39) ...   Dec 11 2007, 15:20
- - Непомнящий Евгений   Просветите плиз - что такое "п/п"?   Dec 10 2007, 06:26
|- - Николай Z   Цитата(Непомнящий Евгений @ Dec 10 2007, 09...   Dec 10 2007, 07:21
- - Непомнящий Евгений   Что такое подпрограмма - я в курсе Просто не сооб...   Dec 10 2007, 07:34
- - SasaVitebsk   Я, собственно так и работаю. И думал так все. В с...   Dec 11 2007, 10:58
- - Panych   Подниму тему, чтоб не плодить... Объявляю внешнюю ...   Apr 7 2008, 13:32
|- - gotty   Цитата(Panych @ Apr 7 2008, 16:32) Подним...   Apr 7 2008, 13:45
|- - alux   Цитата(gotty @ Apr 7 2008, 16:45) И ещё с...   Apr 8 2008, 12:04
- - Panych   gotty спасибо, сделал функцию внешней, IAR ругнулс...   Apr 7 2008, 14:15
|- - MrYuran   Цитата(Panych @ Apr 7 2008, 17:15) gotty ...   Apr 8 2008, 12:11
- - ivainc1789   Тема о многостраничных файлах, задам и свой махонь...   Apr 9 2008, 15:09
|- - Непомнящий Евгений   Цитата(ivainc1789 @ Apr 9 2008, 19:09) Те...   Apr 9 2008, 15:51
|- - rezident   Цитата(ivainc1789 @ Apr 9 2008, 21:09) Те...   Apr 9 2008, 21:55
- - Непомнящий Евгений   Цитата(sKWO @ Apr 13 2008, 14:55) Кодtype...   Apr 14 2008, 04:44
- - alux   Цитата(Непомнящий Евгений @ Apr 14 2008, 07...   Apr 14 2008, 06:33


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016