Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Варнинг компоновщика
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Sergio66
Есть такое определение:
typedef __flash struct
{
unsigned int *var_pointer;
unsigned char position;
unsigned char flags;
char left;
char right;
char up;
char down;
void (*relative_func)();
} item_struct_type;
оно находится в h файле
далее идут определения переменных в файле menu.c

item_struct_type Main_menu[NUMBER] = {инициализация};
и
item_struct_type *current_menu = Main_menu;

есть файл menu.h со следующими строками:
extern item_struct_type Main_menu[NUMBER] ;
и
extern item_struct_type *current_menu;

файл menu.h подключается к нескольким файлдам проекта
все прекрасно компиллируется, при компоновке выдаются 2 варнинга:
Warning[w6]: Type conflict for external/entry "Main_menu", in module Multidisplay against external/entry in module Menu; array types have different element types; different composite type kinds
и
Warning[w6]: Type conflict for external/entry "current_menu", in module LCD against external/entry in module Menu; different composite type kinds
соответственно

если я из этих файлов убираю все, включая #include menu.h, то такие же варнинги переходят на другие файлы, где подключается menu.h
В чем может быть дело.

Модификатор __flash из typedef убирал - ничего не меняется.
boez
Странно, всегда последнее время так делал и никто не ругался... По крайней мере на С. На С++ наверное такого делать нельзя - но я и не пробовал... А главное - непонятно почему линкер, а не компилятор.
Какой компилятор и линкер используются?
Sergio66
Цитата(boez @ Jan 23 2007, 17:57) *
Странно, всегда последнее время так делал и никто не ругался... По крайней мере на С. На С++ наверное такого делать нельзя - но я и не пробовал... А главное - непонятно почему линкер, а не компилятор.
Какой компилятор и линкер используются?

да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы.
IAR 4.20A
IgorKossak
Не забыли охранник поставить в файле menu.h?
Код
#ifndef _MENU_H_
#define _MENU_H_
...
#endif
Sergio66
Цитата(IgorKossak @ Jan 23 2007, 18:03) *
Не забыли охранник поставить в файле menu.h?
Код
#ifndef _MENU_H_
#define _MENU_H_
...
#endif

нет, не забыл. да если бы забыл, то ругался бы компиллятор - "редекларация"
prottoss
Цитата(Sergio66 @ Jan 23 2007, 21:31) *
Есть такое определение:
typedef __flash struct
{...} item_struct_type;
оно находится в h файле
далее идут определения переменных в файле menu.c

item_struct_type Main_menu[NUMBER] = {инициализация};
и
item_struct_type *current_menu = Main_menu;

есть файл menu.h со следующими строками:
extern item_struct_type Main_menu[NUMBER] ;
и
extern item_struct_type *current_menu;

А зачем extern item_struct_type *current_menu;???
зачем определять указатель, если каждому юниту извесно про extern item_struct_type Main_menu[NUMBER] ;???
Каждый юнит когда угодно может взять и создать указатель на массив... не из-за этого ли варнинги?

К тому же подозрительно выглядит присвоение в хедере...
SpiritDance
Есть мыстль что в модуль mulidisplay и в модуль multimenu на самом деле включаются 2 разных файла h с описанием переменных. может буковку какую не поставили и или наоборот поставили. Убедитесь что файл menuh
и декларации extern единственные, через goto definition в IARе.

и это
Код
typedef __flash struct [b]item_struct[/b]
{
unsigned int *var_pointer;
unsigned char position;
unsigned char flags;
char left;
char right;
char up;
char down;
void (*relative_func)();
} item_struct_type;
Sergio66
Цитата(prottoss @ Jan 23 2007, 18:23) *
Цитата(Sergio66 @ Jan 23 2007, 21:31) *
Есть такое определение:
typedef __flash struct
{...} item_struct_type;
оно находится в h файле
далее идут определения переменных в файле menu.c

item_struct_type Main_menu[NUMBER] = {инициализация};
и
item_struct_type *current_menu = Main_menu;

есть файл menu.h со следующими строками:
extern item_struct_type Main_menu[NUMBER] ;
и
extern item_struct_type *current_menu;

А зачем extern item_struct_type *current_menu;???
зачем определять указатель, если каждому юниту извесно про extern item_struct_type Main_menu[NUMBER] ;???
Каждый юнит когда угодно может взять и создать указатель на массив... не из-за этого ли варнинги?

К тому же подозрительно выглядит присвоение в хедере...

Есть 2 массива меню (2 меню) и программа работает только с активным в данный момент. А указатель на активный массив сторок и описателей меню передается именно через присвоение указателю нужного значения. А присвоение происходит не в недере, а в с файле.
boez
Цитата(Sergio66 @ Jan 23 2007, 17:02) *
да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы.
IAR 4.20A

С каких пор компоновщики стали понимать типы? ИМХО для каждого объекта он должен знать секцию, адрес, размер и выравнивание... Ну может еще что-то, но типы? Или я отстал от жизни?
В конце концов попробуйте то же самое собрать gcc.

Цитата(prottoss @ Jan 23 2007, 17:23) *
Цитата(Sergio66 @ Jan 23 2007, 21:31) *
Есть такое определение:

далее идут определения переменных в файле menu.c (!!!)

item_struct_type Main_menu[NUMBER] = {инициализация};

есть файл menu.h со следующими строками:
extern item_struct_type Main_menu[NUMBER] ;

А зачем extern item_struct_type *current_menu;???
зачем определять указатель, если каждому юниту извесно про extern item_struct_type Main_menu[NUMBER] ;???
Каждый юнит когда угодно может взять и создать указатель на массив... не из-за этого ли варнинги?

К тому же подозрительно выглядит присвоение в хедере...


Читайте внимательнее - в хидере только typedef и extern декларация. Настоящая декларация и инициализация в .c файле. Повторяю, у меня на gcc такое прокатывает на ура.
Sergio66
Цитата(boez @ Jan 23 2007, 18:38) *
Цитата(Sergio66 @ Jan 23 2007, 17:02) *

да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы.
IAR 4.20A

С каких пор компоновщики стали понимать типы? ИМХО для каждого объекта он должен знать секцию, адрес, размер и выравнивание... Ну может еще что-то, но типы? Или я отстал от жизни?
В конце концов попробуйте то же самое собрать gcc.

Цитата(prottoss @ Jan 23 2007, 17:23) *
Цитата(Sergio66 @ Jan 23 2007, 21:31) *
Есть такое определение:

далее идут определения переменных в файле menu.c (!!!)

item_struct_type Main_menu[NUMBER] = {инициализация};

есть файл menu.h со следующими строками:
extern item_struct_type Main_menu[NUMBER] ;

А зачем extern item_struct_type *current_menu;???
зачем определять указатель, если каждому юниту извесно про extern item_struct_type Main_menu[NUMBER] ;???
Каждый юнит когда угодно может взять и создать указатель на массив... не из-за этого ли варнинги?

К тому же подозрительно выглядит присвоение в хедере...


Читайте внимательнее - в хидере только typedef и extern декларация. Настоящая декларация и инициализация в .c файле. Повторяю, у меня на gcc такое прокатывает на ура.



Вот то то и странно!
У меня еще много деклараций и определений подобного типа. Ругается только на эти 2.
prottoss
Цитата(boez @ Jan 23 2007, 22:38) *
Читайте внимательнее - в хидере только typedef и extern декларация. Настоящая декларация и инициализация в .c файле. Повторяю, у меня на gcc такое прокатывает на ура.
Сорри, не заметил smile.gif Я тоже применяю такие конструкции, но варнингов нет- IAR 4.10B
boez
Цитата(Sergio66 @ Jan 23 2007, 17:41) *
Вот то то и странно!
У меня еще много деклараций и определений подобного типа. Ругается только на эти 2.

Ну это уже лучше. Ищите различия smile.gif
Возможно путем написания и компиляции промежуточных вариантов между рабочим и нерабочим.

Кстати, слово const слову _flash не мешает. Где-то в соседней ветке рекомендовалось его писать тоже, тогда вкинув в начало #define _flash можно собрать эти же вещи под gcc.
dxp
Цитата(boez @ Jan 23 2007, 21:38) *
Цитата(Sergio66 @ Jan 23 2007, 17:02) *

да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы.
IAR 4.20A

С каких пор компоновщики стали понимать типы?

Со времен С++.


Цитата(Sergio66 @ Jan 23 2007, 20:31) *
Есть такое определение:
typedef __flash struct
{
unsigned int *var_pointer;
unsigned char position;
unsigned char flags;
char left;
char right;
char up;
char down;
void (*relative_func)();
} item_struct_type;
оно находится в h файле
далее идут определения переменных в файле menu.c

item_struct_type Main_menu[NUMBER] = {инициализация};
и
item_struct_type *current_menu = Main_menu;

Попробуйте такой вариант:

Код
struct item_struct_type
{
       unsigned int *var_pointer;
       unsigned char position;
       unsigned char flags;
       char left;
       char right;
       char up;
       char down;
       void (*relative_func)();                      
};

Хотя судя по тексту диагностики, дело не в этом.
Сергей Борщ
Цитата(Sergio66 @ Jan 23 2007, 16:31) *
Есть такое определение:
А вы можете сделать минимальный проект из трех файлов (menu.h, menu.c, и заголовка со структурой), выкинув из них все кроме этих определений? Может гоняя такой исходник на своей машине быстрее ответ отыщем?
shamray
Был такой варнинг. Дело в том, что не должно быть объявления переменной как extern и одновременного объявления ее как локальной в одном файле. А у вас так и получается когда инклудится файл menu.h в menu.c - вначале переменнпая объявляется как extern , а потом как локальная.
Sergio66
Цитата(shamray @ Jan 24 2007, 11:53) *
Был такой варнинг. Дело в том, что не должно быть объявления переменной как extern и одновременного объявления ее как локальной в одном файле. А у вас так и получается когда инклудится файл menu.h в menu.c - вначале переменнпая объявляется как extern , а потом как локальная.

В menu.h стоит охранник
#ifndef _MENU_H_
#define _MENU_H_
....
#endif
так, что повторное объявление отсутствует. Даже если бы это и было, то ругался бы компиллер - смотри выше.
Dog Pawlowa
В данном случае сказать особо нечего, но общее впечатление от собственного понимания причин предупреждений и ошибок ИАРа удручает.
Не далее как вчера. Слово shift не является зарезервированным на C, не так ли? Поле bla_bla_bla.shift дает ошибку, bla_bla_bla.shiftt работает.
Может и тут какая-то фигня с грамматикой?
Сергей Борщ
Цитата(Dog Pawlowa @ Jan 24 2007, 12:17) *
В данном случае сказать особо нечего, но общее впечатление от собственного понимания причин предупреждений и ошибок ИАРа удручает.
Не далее как вчера. Слово shift не является зарезервированным на C, не так ли? Поле bla_bla_bla.shift дает ошибку, bla_bla_bla.shiftt работает.
Может и тут какая-то фигня с грамматикой?
Насчет грамматики не знаю, но я не вижу криминала в приведенном Sergio66 коде. Подозреваю, что проблема где-то в непоказанном окружении кода. Поэтому и предложил сделать минимальный проект, и на его основе либо искать где-то в другом месте, либо пытаться понять чего мы не понимаем. У меня были подобные предупреждения когда я пытался объявить в одном файле массив с явным указанием размера а в другом без указания (через []) или как extern указатель на тип элементов массива.
Sergio66
Ну вот и решение!
Дело в том, что сама структура
typedef __flash struct
{
unsigned int *var_pointer;
unsigned char position;
unsigned char flags;
char left;
char right;
char up;
char down;
void (*relative_func)();
} item_struct_type;
описана в файле def_items.h
который подключен к stdafx.h
а stdafx.h, в свою очередь подключается к menu.c и menu.h
так вот, в файле menu.c def_items.h почему то не подключался. И компилятор не ругался на неизвестный тип item_struct_type.
Как только я подключил def_items.h непосредственно к menu.c, все заработало.
_Bill
Цитата(Sergio66 @ Jan 23 2007, 17:31) *
Есть такое определение:
typedef __flash struct
{
unsigned int *var_pointer;
unsigned char position;
unsigned char flags;
char left;
char right;
char up;
char down;
void (*relative_func)();
} item_struct_type;
оно находится в h файле
далее идут определения переменных в файле menu.c

item_struct_type Main_menu[NUMBER] = {инициализация};
и
item_struct_type *current_menu = Main_menu;

есть файл menu.h со следующими строками:
extern item_struct_type Main_menu[NUMBER] ;
и
extern item_struct_type *current_menu;

файл menu.h подключается к нескольким файлдам проекта
все прекрасно компиллируется, при компоновке выдаются 2 варнинга:
Warning[w6]: Type conflict for external/entry "Main_menu", in module Multidisplay against external/entry in module Menu; array types have different element types; different composite type kinds
и
Warning[w6]: Type conflict for external/entry "current_menu", in module LCD against external/entry in module Menu; different composite type kinds
соответственно

если я из этих файлов убираю все, включая #include menu.h, то такие же варнинги переходят на другие файлы, где подключается menu.h
В чем может быть дело.

Модификатор __flash из typedef убирал - ничего не меняется.

Советую обратить внимание на последовательность включения заголовочных файлов, если их несколько.
SpiritDance
Цитата(Sergio66 @ Jan 24 2007, 14:32) *
Ну вот и решение!
так вот, в файле menu.c def_items.h почему то не подключался. И компилятор не ругался на неизвестный тип item_struct_type.
Как только я подключил def_items.h непосредственно к menu.c, все заработало.

Фигня это какая-то, а не решение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.