Forum: Compiler & IDEs Ubuntu - Probleme mit mehrfachen Header-Files


von Roland E. (roland_91)


Lesenswert?

Hallo,
ich bin gerade dabei ein Datenpaket über Ethernet zu verschicken.

Den Programmcode habe ich soweit fertig, das Kompilieren klappt jedoch 
nicht.
Mein Problem ist, dass bei meinem Betriebssystem die Headerfiles 
teilweise mehrfach unter dem gleichen Namen auftauchen aber mit 
verschiedenem Inhalt.

Konkret bedeutet das, ich habe einmal die Datei if_vlan.h im Dateipfad
/usr/include/linux
und nochmal die Datei if_vlan.h mit anderem Inhalt im Dateipfad
/usr/src/linux-headers-3.19.0-25/include/linux

Alle Versuche manuell Dateien in den ersten Pfad umzukopieren o.Ä 
schlugen fehl, weil die einzelnen Headerfiles wiederum andere 
inkludieren usw.


Mein Lösungsansatz:
Kann man in Makefiles eine Priorität der Include-Dateien einstellen, so 
dass beim Kompilieren erst der erste Dateipfad durchsucht wird, und wenn 
er dort nicht fündig wird, den zweiten Dateipfad durchsucht ?

Gruß Roland

von Markus F. (mfro)


Lesenswert?

Roland E. schrieb:
> Mein Lösungsansatz:
> ...

ist falsch.

Solange Du keine Treiber- bzw. Kernelentwicklung (bzw. ganz spezielle 
Userspace-Entwicklungen) machst, gehen dich die Header in 
/usr/src/linux-headers... nix an.

Die Header in /usr/include/linux sind die, mit denen (wenn richtig 
installiert) deine glibc und andere wichtige Libraries gebaut wurden. Da 
bestehen Abhängigkeiten, die beim "Mischen" nur zu Problemen führen.

Deshalb solltest Du auch nur die verwenden.

Installiere beide Pakete neu und versuch's nochmal. Grundsätzlich ist es 
überhaupt keine gute Idee, Systemdateien, die aus Paketen stammen, wild 
umherzukopieren.

von Roland E. (roland_91)


Lesenswert?

Danke für die rasche Antwort.

Leider gibt es unter /usr/include/linux keine Header-Datei, die eine 
struct für Ethernet-Frames mit VLAN erzeugt, sondern nur die struct 
ether_header.
Unter if_vlan.h des linux-headers-Pfads gäbe es die struct vlan_ethhdr, 
deren Aufbau genau meinen Bedürfnissen entspräche.

Aber naja, dann muss ich den Frame wohl hardcoden.


Gruß Roland

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Roland E. schrieb:
> die eine struct für Ethernet-Frames mit VLAN erzeugt
Das ist doch aber deiner Anwendung voellig wurst, ob das nun LAN, VLAN, 
WLAN, oder sonstwas ist. Darum kuemmern sich die Treiber/der Kernel.
Was waere das fuer ein Aufwand, wenn das jede Anwendung selber 
implementieren muesste?

Warum glaubst du, das du das brauchst?

von xxx (Gast)


Lesenswert?

Erklärung siehe z.B.: 
https://stackoverflow.com/questions/9094237/whats-the-difference-between-usr-include-linux-and-the-include-folder-in-linux

Roland E. schrieb:
> Konkret bedeutet das, ich habe einmal die Datei if_vlan.h im Dateipfad
> /usr/include/linux
=> Header Files für Programme im USER Bereich. User-Space Programme 
können damit Kernel Module ansteuern.


> und nochmal die Datei if_vlan.h mit anderem Inhalt im Dateipfad
> /usr/src/linux-headers-3.19.0-25/include/linux
=> Header Files für Kernel-Module.

Wenn es für das 'Problem' keine Header gibt, dann bedeutet das ganz 
einfach das es keine Schnittstelle aus einem Kernel Modul heraus dafür 
gibt. Entweder gibt es dann dafür andere (evtl. generische) 
Schnittstellen, auf die man zunächst nicht kommt, oder man muss sich ein 
Kernel Modul erstellen.

von Roland E. (roland_91)


Angehängte Dateien:

Lesenswert?

Okay, Danke für die Antwort.

@Kaj und natürlich auch für jeden anderen Interessierten:

Ich will über eine Ethernetverbindung einen Display(der war mal in einem 
Auto verbaut) ansteuern.
Im angehängten Bild ist der geforderte Aufbau für meine Datenpakete.

Gruß
Roland

von Markus F. (mfro)


Lesenswert?

Roland E. schrieb:
> Im angehängten Bild ist der geforderte Aufbau für meine Datenpakete.

Soweit ich das auf die Schnelle erkenne, ist das ein völlig normales 
ICMP-Paket.

Warum willst Du unbedingt an den VLAN-Tags rumfummeln?

von Roland E. (roland_91)


Lesenswert?

Im Bereich "Ethernet MAC" steht unter der MAC-Sourceaddresse doch 
"VLAN_TPID", "VLAN_PRIO", "VLAN_CFI" und "VLAN_ID".

Danach folgen dann die Header für IPv4 und ICMP sowie die Nutzdaten.

von Markus F. (mfro)


Lesenswert?

Aber so macht man das nicht.

Falls dein komisches Device ernsthaft auf VLAN-Tags besteht (was ich 
ernsthaft bezweifle, schliesslich ist es ja kein Switch und wozu soll 
das dann gut sein?), dann erzeugst Du die doch nicht von Hand.

Definiere auf deiner Linux-Maschine einfach ein Tagging Interface, den 
Rest macht dein IP-Stack von alleine (Du schickst völlig "normale" 
Pakete drüber und das Interface macht das Tagging).

Google mal nach "Linux 802.1Q", da gibt's etliche How-To's.

von Roland E. (roland_91)


Lesenswert?

Markus F. schrieb:
>
>
> Falls dein komisches Device ernsthaft auf VLAN-Tags besteht (was ich
> ernsthaft bezweifle, schliesslich ist es ja kein Switch und wozu soll
> das dann gut sein?), dann erzeugst Du die doch nicht von Hand.
>

Es könnte mit der Möglichkeit des Daisy-Chaining zusammenhängen. Aber da 
ich nie einen Gedanken daran verschwendet habe mehrere Displays zu 
verwenden, habe ich dieses Kapitel im Manual nicht einmal überflogen.

Ansonsten werde ich mal deinen Rat befolgen, allerdings eher mit 
duckduckgo ;-)

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.