LINUX.ORG.RU

помогите!!!


0

0

Я недавно начал программитровать под Linux, используя специфику ядра, начал с написания модулей, и тут возникла такая проблема; в коде:

#ifndef __KERNEL__ #define __KERNEL__ #endif #include <linux/fs.h>

простейший модуль на 20 строк кода, при компилляции: gcc -Wall -c module.c вылезает по меньшей мере 100 однотипных ошибок типа:

In file included from /usr/include/linux/fs.h:272, from module.c:7: /usr/src/linux/include/linux/hpfs_fs_i.h:5:parse error befor 'ino_t' /usr/src/linux/include/linux/hpfs_fs_i.h:5:warning:no semicolon at end of struct or union /usr/src/linux/include/linux/hpfs_fs_i.h:12;parse error befor semicolon

и таких во всевозможных файлах... А без #define __KERNEL__ все нормально Все линки вроде стоят нормально помогите, а то я на этом застопорился, а спросить не у кого

anonymous

А у тебя модуль в одном С-шном файле? Вобщето странно, если ты
используешь иструкции препроцессора в программе, состоящей из одного
файла - такие вещи обычно встречаются в хидерах, когда есть
возможность возникновения переопределений. Ну например, делаешь
хидер module.h, в котором:

#ifndef __KERNEL__
#define __KERNEL__
??? somefunc1(...);
??? somefunc2(...);
#endif

а реализации кладешь в module.c:

#include "module.h"
#include <linux/fs.h>

??? somefunc1 (..){
..
..
return ???;
}

??? somefunc2 (..){
..
..
return ???;
}

PETER ★★
()

Да, модуль в одном файле. А #define __KERNEL__ я делаю, чтоб было возможно пользоваться некоторыми функциями из kernel headers: без #define __KERNEL__ они просто не определяются(насколько я понимаю). Но пока я не решил эту проблемму, я ими не пользуюсь, поэтому я имею возможномть откомпилить module и без #define __KERNEL__. Ну так как мне быть?

anonymous
()

Может ты все таки не так понимаешь? Обычно, когда определяют конструкцию #ifndef _XXX_ #define .... #endif добиваются того чтобы в уже собранную программу (модуль) не попал дублирующийся код (в данном случае многочисленной объявление однотипных функций). В твоем случае ты просто определяешь данную директиву и тем самым препятствуешь препроцессору вставить необходимый код (объявления функций) => куча ошибок. Почитай Кернигана и Ричи и пока не берись за дрова.

anonymous
()

C я знаю, опыт есть. Здесь вопрос конкретный: про #define именно __KERNEL__ и именно в модуле к тому же ошибки не связаны с тем, что чего-то не хватает, там ошибки разбора

anonymous
()

Компилятор ядерных includ-ов не находит и пользуется системными
gcc -I/usr/src/linux/include (или где у тебя ядерные хедеры лежат)
geekkoo

anonymous
()

нет, все в порядке: /usr/include/linux --->/usr/src/linux/include (symlink)

anonymous
()

Я тут покопался, и выяснил, что #define __KERNEL__ нужен для ВКЛЮЧЕНИЯ ядровых деклараций и include- ания доп. файлов. Так почему же у меня не компилится? Помогите, пожалуйста, работа стоит.

anonymous
()

за #ifdef __KERNEL__ , например в /usr/src/linux/include/linux/fs.h, стоят декларации таких чисто ядрёных функций и перерменных, как : void mark_inode_dirty(struct inode *);

int lock_verify_locked(struct inode *);

сисьемных вызовов :

int sys_open(const char, int, int);

int sys_close(unsigend int);

(а системный вызовы никогда не используются напрямую, а под вуалью glibc) определение struct inode , как типа данных и тому подобное... короче, все это не используется в user space

Так вот #define __KERNEL__ нужен, чтобы все эти декларации включались, и если они включаютчя, у меня ничего не компилится, и наооборот, компилится без них.

Как быть? Я уже отчаялся? Помогите!!!(пожалуйста)

anonymous
()

Попробуй все же как я писал выше - раздельно оформить хидер и сишник ( это же не трудно ).

PETER ★★
()

Спасибо за помощь! Я приведу код модуля, что бы показать, что это безполезно:

#define __KERNEL__ #define MODULE #include <linux/module.h> #include <linux/fs.h> int init_module(void){ printk("<1>Module init."); return 0; } void cleanup_module(void){ printk("<1>Module cleanup."); }

и, как я уже писал, много однотипных ошибок, связанных толи c синтаксисом, толи еще с чем-то: /usr/include/linux/fs.h:845:parse error befor `dev_t' и т.п. Но если убрать #include <linux/fs.h>, то все OK, но мне он нужен...

ядро 2.2.20, gcc 2.95.3

anonymous
()

Отчаявшемуся анонимусу
А все же ты сделал gcc -I... или нет?
То что у тебя symlink стоит - то это ничего не значит (hint посмотри куда он ведет)
И вообще - тут не надо думать а надо прыгать. Тебе предложили два варианта решения проблемы (один из вариантов впрочем бесполезен), ты же по всей видимости ни один из них не попробовал, а вместо этого начал доказывать почему они не должны работать.
geekkoo

anonymous
()

все выяснил СПАСИБО ВСЕМ ОГРОМНОЕ!!!!( помогло -I/usr/src/linux/include) Но все же интересно, почему sylink не сработал? /usr/include/linux->/usr/src/linux/include

anonymous
()

а ты уверен что /usr/include/linux->/usr/src/linux/include?

afair в линухе два стандартных симлинка на кернельные инклюды:

/usr/include/asm -> /usr/src/linux/include/asm

/usr/include/linux -> /usr/src/linux/include/linux

ananas ★★★★★
()

Уверен:

/usr/include/asm -> /usr/src/linux/include/asm-i386

/usr/include/linux -> /usr/src/linux/include/linux

так и стоит

anonymous
()

что-то я не пойму в чем ваша проблема :)

ну если у тебя не только прототипы в хидере то и делай #ifndef MY_DIRTY_H #define MY_DIRTY_H ... #endif

если тебе надо __KERNEL__ ну и дефайнь его...

мухи отдельно котлеты отдельно?

anonymous
()

O <p>Ops [<p>]Ops

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.