Отговори на тема  [ 13 мнения ] 
RQ:AVR,GCC:"Error:multiple definition..." &ДРУ 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 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 | Прегледано 2342 пъти ]


Последна промяна NikB на Съб Мар 19, 2011 8:24 pm, променена общо 2 пъти

Съб Мар 19, 2011 4:31 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
какво има да се чудиш - това явно е грешка на линкера - всеки път като включиш H в някой C - дефинираш тая променлива

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


Съб Мар 19, 2011 4:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение 
махни #include "EncodePho.h" от единия *.с файл


Съб Мар 19, 2011 4:53 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Поне една читава книжка за С нямаш ли?
EncodePho.h:
Код:
extern uint8_t enphDDE[];


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


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


Последна промяна tolstolob на Съб Мар 19, 2011 5:09 pm, променена общо 1 път



Съб Мар 19, 2011 5:01 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 
ps66 написа:
какво има да се чудиш - това явно е грешка на линкера - всеки път като включиш H в някой C - дефинираш тая променлива

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

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

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


Съб Мар 19, 2011 5:07 pm
Профил ICQ WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение Re: Поне една читава книжка за С нямаш ли?
tolstolob написа:
EncodePho.h:...


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


Съб Мар 19, 2011 5:13 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
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_ не са глобални !

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


Съб Мар 19, 2011 5:51 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение Още нещо (по темата) да питам
ps66 написа:
дефинициите като - ENCODEPHO_H_ не са глобални !

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

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


Съб Мар 19, 2011 6:11 pm
Профил ICQ WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение 
На двете места.


Съб Мар 19, 2011 6:25 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 
tolstolob написа:
...
Хронично, за трети път (поне), ме спасяваш бързо и точно. Благодаря!


Последна промяна NikB на Съб Мар 19, 2011 8:43 pm, променена общо 1 път



Съб Мар 19, 2011 8:42 pm
Профил ICQ WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 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..." да търся в същите файлове, до които има връзка проекта ми?


Съб Мар 19, 2011 8:42 pm
Профил ICQ WWW
Ранг: Новодошъл
Ранг: Новодошъл

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


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


Последна промяна Cino на Съб Мар 19, 2011 9:25 pm, променена общо 1 път



Съб Мар 19, 2011 9:04 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 
Cino написа:
трябва да ...

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

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

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


Съб Мар 19, 2011 9:10 pm
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 13 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни