Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

RQ:AVR,GCC:"Error:multiple definition..." &ДРУ
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8718
Страница 1 от 1

Автор:  NikB [ Съб Мар 19, 2011 4:31 pm ]
Заглавие:  RQ:AVR,GCC:"Error:multiple definition..." &ДРУ

RQ: AVR, GCC: "Error: multiple definition of blabla"

Правя проект, добавям C и H файл и на всяка дефиниця в H файла ми дава тая грешка (но я пoказва, че е в O файла)

Що я дава тая грешка? Какво не съм направил както трябва?
Направих отделен проект да го пробвам.
Ако махна моите файлове и добавя други C и H файлове - няма проблем :). Явно, познава, че аз съм ги писал :) :) :)

И трите файла са на картинката тука. Поствам и прикрепен проект (най-долу).

Прикачени файлове:
aaa_Test(H).rar [14.75 KiB]
153 пъти
Err.JPG
Err.JPG [ 100.34 KiB | Прегледано 2367 пъти ]

Автор:  ps66 [ Съб Мар 19, 2011 4:46 pm ]
Заглавие: 

какво има да се чудиш - това явно е грешка на линкера - всеки път като включиш H в някой C - дефинираш тая променлива

много тъп начин на дефиниране си избрал (не ти е виновен компилатора/линкера!)

Автор:  CarBeta [ Съб Мар 19, 2011 4:53 pm ]
Заглавие: 

махни #include "EncodePho.h" от единия *.с файл

Автор:  tolstolob [ Съб Мар 19, 2011 5:01 pm ]
Заглавие:  Поне една читава книжка за С нямаш ли?

EncodePho.h:
Код:
extern uint8_t enphDDE[];


EncodePho.c:
Код:
uint8_t enphDDE[4] = {DDE4, DDE5, .... };


Всичко в хедърите трябва да е extern. Темата е дъвкана поне 100 пъти!

Автор:  NikB [ Съб Мар 19, 2011 5:07 pm ]
Заглавие: 

ps66 написа:
какво има да се чудиш - това явно е грешка на линкера - всеки път като включиш H в някой C - дефинираш тая променлива

Благодаря, но
1. Има
#ifndef ENCODEPHO_H_
#define ENCODEPHO_H_
...
#endif /* ENCODEPHO_H_ */
2. По същия начин са дефинирани и lcd_lib.c и lcd_lib.h, а не дават грешки, като ги добавя ползвам в проекта.

ps66 написа:
много тъп начин на дефиниране си избрал (не ти е виновен компилатора/линкера!)

A по-острият начин какъв е?

Автор:  NikB [ Съб Мар 19, 2011 5:13 pm ]
Заглавие:  Re: Поне една читава книжка за С нямаш ли?

tolstolob написа:
EncodePho.h:...


Благодаря! Имам маса книжки, не зная кое е съществено :).
Даже МНОГО благодаря :)!

Автор:  ps66 [ Съб Мар 19, 2011 5:51 pm ]
Заглавие: 

NikB написа:
ps66 написа:
какво има да се чудиш - това явно е грешка на линкера - всеки път като включиш H в някой C - дефинираш тая променлива

Благодаря, но
1. Има
#ifndef ENCODEPHO_H_
#define ENCODEPHO_H_
...
#endif /* ENCODEPHO_H_ */
2. По същия начин са дефинирани и lcd_lib.c и lcd_lib.h, а не дават грешки, като ги добавя ползвам в проекта.

ps66 написа:
много тъп начин на дефиниране си избрал (не ти е виновен компилатора/линкера!)

A по-острият начин какъв е?


дефинициите като - ENCODEPHO_H_ не са глобални !

по-острите начини са ти ги написали по-горе !

Автор:  NikB [ Съб Мар 19, 2011 6:11 pm ]
Заглавие:  Още нещо (по темата) да питам

ps66 написа:
дефинициите като - ENCODEPHO_H_ не са глобални !

Благодаря ти, но какъв е смисъла от тях тогава? Да ограничават да не се дублират include в един файл? :) странно, ако може да изкажа позиция:)

---------------------
Още нещо (по темата) да питам, относно
Къде, в H или в C файла или на двете места да сложа volatile (не желая да се опитва да оптимизира, преди да съм изчел подробно за оптимизации :))
(както е указано по-горе:
в H:
extern uint8_t enphDDE[];
в C:
uint8_t enphDDE[4] = {DDE4, DDE5, .... };
)

Автор:  tolstolob [ Съб Мар 19, 2011 6:25 pm ]
Заглавие: 

На двете места.

Автор:  NikB [ Съб Мар 19, 2011 8:42 pm ]
Заглавие: 

tolstolob написа:
...
Хронично, за трети път (поне), ме спасяваш бързо и точно. Благодаря!

Автор:  NikB [ Съб Мар 19, 2011 8:42 pm ]
Заглавие:  iom128.h - къде и кога се дефинира и т.н.

Да продължа с питанките, който ги няма (или трудно се намират) в книгите:

iom128.h - къде и кога се дефинира и т.н.:

Постановка на задачата:
GCC с Avr studio 5 (едва ли в тая част има разлика с 4)
Изтеглих един проект от мрежата, но не е означен процесорът. Избрах си Atmega128.
Имаше две предупреждения "appears to be a misspelled signal handler" (за SIG_USART_DATA и за SIG_USART_RECV).
Напсувах ги и видях, че в iom128.h тия вектори са декларирани по три начина. С USART0_UDRE_vect и USART0_RX_vect предупрежденията се оправиха :).
Като щтракна на USART0_UDRE_vect и избера "find definition" ми се отваря iom128.h.
Потърсих (с "Find in solution") къде в проекта ми е деклариран iom128.h и не го намерих.

И ПИТАНКАТА
Как компилаторът и линкерът стигат до това чудо iom128.h и ИМА ЛИ НАЧИН като търся с "Find..." да търся в същите файлове, до които има връзка проекта ми?

Автор:  Cino [ Съб Мар 19, 2011 9:04 pm ]
Заглавие: 

трябва да инклуднеш в проекта си фаила <io.h>
#include <io.h>
който се намира примерно в "C:\WinAVR-20100110\avr\include\avr"
да зададеш на авр студиото къде да си търси инклуде директорията.
да зададеш в configuration options на проекта кой контролер ползваш
тогава компилатора си дефинира дефиниция указваща типа на контролера
примерно "__AVR_ATmega128__", и от този файл io.h, си инклудва съответния
IO файл за контролера който ползваш. от същата тази папка
примерно "iom128.h"


EDIT:
а можеш да търсиш в файловете като ги инклуднеш в дървото на проекта , в AVR Studio, и след това компилираш :)
така само ако са инкулуднати като фаилове не търси в тях наистина

Автор:  NikB [ Съб Мар 19, 2011 9:10 pm ]
Заглавие: 

Cino написа:
трябва да ...

Да, така съм го направил (при създаване на проекта съм указал девайс).
Иначе нямаше да ми покаже, че взема векторите от iom128.h.

Но не разбирам как това отговаря на въпросите ми :).

ПП
Пардон - отговаря на първия въпрос, значи не ми е ясен само отговора на втория въпрос :).
И не е ясно защо за някои от начина на дефиниране на векторите в iom128.h стават предупреждения.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/