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

 
 
> Multiple definitions, в Keil (компилер GCC)
Leen
сообщение Feb 2 2007, 06:24
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 5-08-06
Из: Владивосток
Пользователь №: 19 343



Есть набор исходников (из проекта AT91 USB Framework - Core 1.01), в каждый Сишный файл включено неск. хидеров, в частности, usb.h... Все хидеры имеют одну и ту же структуру:

#ifndef _(имя_файла)_H
#define _(имя_файла)_H
Внутри всякие объявления, и пр.,
в том числе:
#define inline _inline
.
.
.
inline unsigned int USB_GetState(const S_usb *pUsb)
{
return (*(pUsb->pState) & 0x0000FFFF);
}
.
.
.
#endif

По идее, такая структура не должна давать глюки при включении хидера в несколько файлов проекта. Но дает на этапе линковки:

udp.o(.text+0x3188):Core/usb.h:1378: multiple definition of `USB_GetState'
enumeration_example.o(.text+0x1bf4):Core/usb.h:1378: first defined here

Уже лыжи не едут! Че ему надо???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
Alex03
сообщение Feb 2 2007, 08:37
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(Leen @ Feb 2 2007, 08:24) *
Уже лыжи не едут! Че ему надо???


Видимо у Вас inline не инлайнится! smile.gif
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Feb 2 2007, 09:51
Сообщение #3


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



static inline ему надо

#define inline __inline убрать.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
VDG
сообщение Feb 2 2007, 15:22
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 845
Регистрация: 10-02-06
Пользователь №: 14 193



Цитата(Leen @ Feb 2 2007, 06:24) *
multiple definition of `USB_GetState'

Это недоделка компилятора. Например в CV тоже самое. #define действует в пределах файла (по хорошему он должен действовать в пределах проекта), и _(имя_файла)_H из других файлов невиден. Поэтому возникает ошибка "пере/мульти-определения".


--------------------
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Feb 2 2007, 15:28
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(VDG @ Feb 2 2007, 15:22) *
Цитата(Leen @ Feb 2 2007, 06:24) *

multiple definition of `USB_GetState'

Это недоделка компилятора. Например в CV тоже самое. #define действует в пределах файла (по хорошему он должен действовать в пределах проекта), и _(имя_файла)_H из других файлов невиден. Поэтому возникает ошибка "пере/мульти-определения".

не понял, с чего бы это #define из h-файла должен быть виден в пределах всего проекта??
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 2 2007, 15:31
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
Это недоделка компилятора.

В CV может быть. А в данном случае это некорректное опрделение инлайна.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
VDG
сообщение Feb 2 2007, 15:38
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 845
Регистрация: 10-02-06
Пользователь №: 14 193



Цитата(sergik_vrn @ Feb 2 2007, 15:28) *
не понял, с чего бы это #define из h-файла должен быть виден в пределах всего проекта??

Для того чтобы хидер подключить только единожды. Как в VisualC++.

ЗЫ. В данном случае, действительно дело в инлайне. Иначе бы вылезли и другие ошибки, так как там есть и другие объявления.

Сообщение отредактировал VDG - Feb 2 2007, 15:41


--------------------
Go to the top of the page
 
+Quote Post
DASM
сообщение Feb 2 2007, 15:41
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Пардон, причем тут недоделки компилятора ??? Хидер каждый раз включается ОДИН раз, но в нем definition !!! ( а не declaration)
И при линковке имеем несколько нестатических функций с один и тем же именем, на что линковщик естественно матерится.
static - именно то что надо. Хотя если бы inline работал, то все было бы хорошо.. Надо в стандарт заглянуть, что-то я не думал про это
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Feb 2 2007, 15:51
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(VDG @ Feb 2 2007, 15:38) *
Цитата(sergik_vrn @ Feb 2 2007, 15:28) *

не понял, с чего бы это #define из h-файла должен быть виден в пределах всего проекта??

Для того чтобы хидер подключить только единожды. Как в VisualC++.

ЗЫ. В данном случае, действительно дело в инлайне. Иначе бы вылезли и другие ошибки, так как там есть и другие объявления.

позвольте с Вами категорически не согласиться. не знаю уж, как там в visual c++, но в нормальном с++, и тем более в с это будет противоречить всей концепции языка! построенной на принципе раздельной компиляции. не вдаваясь в рассуждения о том, хорошо это или плохо, но это так, и обсуждению не подлежит.
что касается рассматриваемого вопроса, то там все понятно и люди внятно ответили - если бы inline выполнялся правильно, то не было бы никаких проблем. подозреваю даже, что это не вина компилятора, а просто автор кода напрасно изменил значение inline с помощью непонятного определения _inline
Go to the top of the page
 
+Quote Post
VDG
сообщение Feb 2 2007, 20:21
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 845
Регистрация: 10-02-06
Пользователь №: 14 193



серджик_врн,

Не хочется выглядеть "к каждой бочке затычкой" и в ответ "категорически не соглашаться", создавая офтоп на пустом месте.
Приведу только кусок кода для хедера, объясняющий зачем это нужно и как это удобно применять.
Если это противоречит вашему понятию "всей концепции языка", то пора бы эту концепцию подучить smile.gif
А о незнании VC программисту лучше смолчать, а не программистам тем более.

#if !defined(AFX_ENTERDLG_H__D4A31FE2_9E8C_11D8_964F_D72B7675A5C0__INCLUDED_)
#define AFX_ENTERDLG_H__D4A31FE2_9E8C_11D8_964F_D72B7675A5C0__INCLUDED_

... основной текст хедера

#endif // !defined(AFX_ENTERDLG_H__D4A31FE2_9E8C_11D8_964F_D72B7675A5C0__INCLUDED_)


--------------------
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 2 2007, 21:00
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Если уж на то пошло, #define это директива препроцессора и никакой области видимости она не имеет и никакой сущности в программе не отображает. Это просто способ управления процессом компиляции.
Цитата
Если это противоречит вашему понятию "всей концепции языка", то пора бы эту концепцию подучить А о незнании VC программисту лучше смолчать, а не программистам тем более.

Я б сказал кому стоит подучить концепцию. Тем более VC это очень частный случай и какие нибудь Юникс-гуру могли ни разу его и не запускать smile.gif
Тем более в сабже стоит - GCC smile.gif


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 17:46
Рейтинг@Mail.ru


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