Я пытаюсь откомпилировать исходники драйвера для нестандартной платы компилятором gcc (версия 2.95.2) . Имеются скрипты и makefile для компиляции. В принципе достаточно запустить скрипт и все… Но не тут-то было. Дело в том, что я компилирую в Виндах, используя Cygwin.
При компиляции появляется ошибка следующего содержания: dereferencing pointer to incomplete type. Причем данная ошибка появляется не в строке, где происходит объявление переменной данного типа (это структура), а в момент обращения к ее полям.
Помогите разобраться, так как я никогда раньше не компилировала с помощью gcc, и никогда такой ошибки не встречала.
Могу сказать точно, что файл, где объявлена данная структура включен в файл, в котором происходит обращение к ее полям. В файле makefile стоит ключ компиляции -l и прописан путь где лежит данный файл.
Может кто-нибудь может указать мне направление, куда копать. Заранее спасибо.
Здравствуйте, Helga_F, Вы писали:
H_F>Я пытаюсь откомпилировать исходники драйвера для нестандартной платы компилятором gcc (версия 2.95.2) . Имеются скрипты и makefile для компиляции. В принципе достаточно запустить скрипт и все… Но не тут-то было. Дело в том, что я компилирую в Виндах, используя Cygwin.
Если это драйвера ядра Linux, то скомпилировать под Cygwin не получится, так как
1) нет заголовочных файлов самого ядра
2) формат exe и dll файлов отличается от формата исполняемых файлов linux (elf)
3) ......... и еще куча проблем
little_alex wrote: > Если это драйвера ядра Linux, то скомпилировать под Cygwin не получится, > так как > 1) нет заголовочных файлов самого ядра
1. Копируются из Линукса.
> 2) формат exe и dll файлов отличается от формата исполняемых файлов > linux (elf)
Есть замечательная штука — кросс-компилятор.
> 3) ......... и еще куча проблем
Решаемы.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[2]: Непонятная ошибка при компиляции gcc
От:
Аноним
Дата:
13.06.06 17:15
Оценка:
Здравствуйте, little_alex, Вы писали:
_>Если это драйвера ядра Linux, ...
Вообще-то нет.
Попробую объяснить. Дело в том что я компилирую данные драйвера для ОC реального времени VxWorks.
Производитель платы утверждает, что драйвера могут работать под даннуй ОС.
В качестве компилятора можно использовать gcc, поэтому я и обратилась на этот форум с просьбой помочь.
Пардон, забыла зарегистрироваться.
Здравствуйте, little_alex, Вы писали:
_>Если это драйвера ядра Linux...
Вообще-то нет.
Попробую объяснить. Дело в том что я компилирую данные драйвера для ОC реального времени VxWorks.
Производитель платы утверждает, что драйвера могут работать под даннуй ОС.
В качестве компилятора можно использовать gcc, поэтому я и обратилась на этот форум с просьбой помочь.
Helga_F wrote: > Вообще-то нет. > Попробую объяснить. Дело в том что я компилирую данные драйвера для ОC > реального времени VxWorks. > Производитель платы утверждает, что драйвера могут работать под даннуй ОС. > В качестве компилятора можно использовать gcc, поэтому я и обратилась на > этот форум с просьбой помочь.
Ага, ситуация проясняется. Можно кусок кода, вызывающий ошибку?
Helga_F wrote: > Вообще-то нет. > Попробую объяснить. Дело в том что я компилирую данные драйвера для ОC > реального времени VxWorks. > Производитель платы утверждает, что драйвера могут работать под даннуй ОС. > В качестве компилятора можно использовать gcc, поэтому я и обратилась на > этот форум с просьбой помочь.
Какой gcc стоит? Cygwin'овский по умолчанию или кросс-gcc?
Здравствуйте, Cyberax, Вы писали:
C>Ага, ситуация проясняется. Можно кусок кода, вызывающий ошибку?
Сам код давать бесмысленно.
В одном файле описана тип-структура (указатель на структуру).
В другом файле объявлена переменная данного типа — здесь компилятор не выдает ошибку.
Но далее во всех местах кода при любом обращении к полям данной переменной появляется данная ошибка.
Helga_F wrote: > C>Ага, ситуация проясняется. Можно кусок кода, вызывающий ошибку? > Сам код давать бесмысленно. > В одном файле описана тип-структура (указатель на структуру). > В другом файле объявлена переменная данного типа — здесь компилятор не > выдает ошибку. > Но далее во всех местах кода при любом обращении к полям данной > переменной появляется данная ошибка.
Понятно. Подключите h-файл с _определением_ структуры во все файлы, где
выдается ошибка.
Helga_F wrote: > C>Понятно. Подключите h-файл с _определением_ структуры во все файлы, где > C>выдается ошибка. > Дело в том, что он везде подключен. Я проверяла
Тогда смотрите на неправильные кольцевые зависимости (если ошибка внутри
h-файла). Еще посмотрите не отключено ли определение каким-нибудь
#ifdef'ом.
Helga_F wrote: > C> Еще посмотрите не отключено ли определение каким-нибудь > C>#ifdef'ом. > Я так понимаю, если данное определение было бы отключено, то ошибка > выдавалась при объявлении переменной данного типа, > а не при обращении к ее полям
Нет.
При объявлении указателя достаточно неполного типа (incomplete type):
struct A
{
struct B *something; //Неполный тип
};
//Попытка обращения к полям типа B вернет ошибку:
A str;
str.something->something2=NULL; //Будет ошибка
//А вот после этого определения все должно быть ОК:struct B
{
struct A *something2;
};
Helga_F wrote: > C> Еще посмотрите не отключено ли определение каким-нибудь > C>#ifdef'ом. > > Я так понимаю, если данное определение было бы отключено, то ошибка > выдавалась при объявлении переменной данного типа, > а не при обращении к ее полям
Нет. Переменная объявлена как
struct horror* cute;
Такое ветка 2.* позволяла делать до определения в надежде на последующее
счастье (3.* тоже, 4.* уже нет). После этого идёт cute->field , а тут
только оказалось, что счастье не последовало.
Кстати, посмотрите в makefile, как вызывается "as" (или ld). Если просто
/usr/bin/as, то плохо. Если хитрее — найти где он лежит и вызвать с
ключом --version/--help. В выводе поискать слово target. Какой формат
нужен VxWorks и какой процессор — не знаю, но если это не
i386-linux/cygwin-elf (что скорее всего) , то есть шанс отличить
struct sci_unit {
unsigned32 deviceNo;
unsigned8 unit_no;
... // объявление других полей
};
typedef volatile struct sci_unit *Sci_p;
// в другом файле:
Sci_p sci_p;
sci_p->unit_no=0; // вот здесь ошибка dereferencing pointer to incomplete type
Helga_F wrote: > В коде это выглядит так: > struct sci_unit { > unsigned32 deviceNo; > unsigned8 unit_no; > ... // объявление других полей > }; > typedef volatile struct sci_unit *Sci_p;
А если убрать volatile? Может какие-то глюки 2.95?
> // в другом файле: > Sci_p sci_p; > sci_p->unit_no=0; // вот здесь ошибка /dereferencing pointer to incomplete type/
А что будет если перед этим просто тупо cut&paste'ом вставить:
little_alex wrote: >> > 3) ......... и еще куча проблем > C>Решаемы. > Интересно сколько займет времени создание нормального окружения для > сборки модуля ядра под Cygwin? > И зачем это нужно?
Например, для встраиваемого устройства, где все равно нужно использовать
кросс-компиляцию.