Forum: PC-Programmierung Linux Modulprogrammierung EXPORT oder Deklaration


von Markus R. (mark989)


Lesenswert?

Hi, bin grad dabei ein Linux Treibermodul mit mehreren sourcefiles zu 
schreiben. Das heißt ja das ich Funktionen(oder Variablen) exportieren 
muss, um sie in den anderen Files aufrufen zu können. Den Fehler den ich 
jetzt erhalte ist: In test.h ist die Funktion func() deklariert, in 
test.c ist sie definiert. Jetzt muss ich sie aber in test.c auch 
exportieren( EXPORT_SYMBOL(func) )! Und da erhalte ich den Fehler: 
error: conflicting types for 'func'!!!
Ohne Deklaration in test.h funktioniert es natürlich.
Jemand eine Idee??

Gruß Markus

von Peter II (Gast)


Lesenswert?

Markus R. schrieb:
> Jetzt muss ich sie aber in test.c auch
> exportieren( EXPORT_SYMBOL(func) )!

und warum? Recht es nicht das in der H datei zu machen, diese wird doch 
includiert ist damit steht es doch in er C datei.

von Basti (Gast)


Lesenswert?

Also wir hier in der Firma suchen genau dich!

Diverse Prototypen auflöten und noch Geld dafür bezahlen und dabei Spaß 
an der Arbeit mitbringen...

Genial!

von Basti (Gast)


Lesenswert?

Hm, hier wars wohl falsch!

von Markus R. (mark989)


Lesenswert?

ok erledigt. Jetzt wird fehlergemeldet das die Headerdateien nicht 
gefunden werden. Ist es hier genauso wie im Userspace?? Eigene Header 
mit "header.h" und Systemheader mit <header.h> ??

Im Moment sieht mein Makefile so aus:

obj-m += modul.o
modul-objs := modul1.o modul2.o

KDIR  := /home/markus/Desktop/rpi/linux-rpi-3.6.y/
ARCH  := arm
CCOMP  := 
/home/markus/Desktop/rpi/tools-master/arm-bcm2708/arm-bcm2708hardfp-linu 
x-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
PWD  := $(shell pwd)

default:
  $(MAKE) -C $(KDIR) ARCH=$(ARCH) CROSS_COMPILE=$(CCOMP) M=$(PWD) 
modules

Wie kann ich dem Makefile sagen das die Headerdateien im gleichen 
Verzeichniss wie die c-Dateien liegen, und er nicht irgendwo in der 
Linuxverzeichnisstruktur sucht?

Danke!!

von Hans Ulli K. (Gast)


Lesenswert?

Markus R. schrieb:
> ok erledigt. Jetzt wird fehlergemeldet das die Headerdateien nicht
> gefunden werden. Ist es hier genauso wie im Userspace?? Eigene Header
> mit "header.h" und Systemheader mit <header.h> ??
> Kommt drau an
> Im Moment sieht mein Makefile so aus:
>

Kommt drauf an.
Wenn du im nur die .h Dateien aus dem "Modul" Verzeichnis haben willst
#include "header.h"

> obj-m += modul.o
> modul-objs := modul1.o modul2.o
>
> KDIR  := /home/markus/Desktop/rpi/linux-rpi-3.6.y/
> ARCH  := arm
> CCOMP  :=
> /home/markus/Desktop/rpi/tools-master/arm-bcm2708/arm-bcm2708hardfp-linu 
x-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
> PWD  := $(shell pwd)
>
> default:
>   $(MAKE) -C $(KDIR) ARCH=$(ARCH) CROSS_COMPILE=$(CCOMP) M=$(PWD)
> modules
>
> Wie kann ich dem Makefile sagen das die Headerdateien im gleichen
> Verzeichniss wie die c-Dateien liegen, und er nicht irgendwo in der
> Linuxverzeichnisstruktur sucht?
>

s.o.

> Danke!!

Warum willst du dein Modul ausserhalb der Kernelsourcen bauen ??

von Markus R. (mark989)


Lesenswert?

> Warum willst du dein Modul ausserhalb der Kernelsourcen bauen ??
Ich crosscompeliere das Modul für eine ARM-Platform.

Ich hab den Fehler gefunden. Das Makefile muss wie folgt aussehen:
obj-m += wholemodule
wholemodule-objs := modul.o modul1.o modul2.o

Wobei wholemodule kein sourcefile ist.
Ich dachte an dieser Stelle muss die Haupt-C-Datei aufgeführt sein.
Alles klar vielen Dank!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.