Redefinition beim include von zwei Bibliotheken

Herakles

Profifragensteller
Moin!

Programmierumgebung: Ubuntu Linux!!!!!!!

Ich MUSS innerhalb eines Programms auf die <iwlib.h> und auf die <linux/if_fddi.h> zugreifen. Dumm dabei ist nur, dass innerhalb der <linux/if_fddi.h> ein

Code:
#include <linux/netdevice.h>

drinsteckt. In <linux/netdevice.h> wiederum gibt es ein

Code:
#include <linux/if.h>

, was es genauso auch in der zuerst genannten <iwlib.h> gibt. Dadurch entsteht diese Fehlermeldung:

Code:
gcc -c -Wall -I. simple_wlan.c
In file included from /usr/local/include/iwlib.h:87,
                 from simple_wlan.h:27,
                 from simple_wlan.c:1:
/usr/include/net/if.h:45: Fehler: syntax error before numeric constant
/usr/include/net/if.h:111: Fehler: Redefinition von »struct ifmap«
/usr/include/net/if.h:126: Fehler: Redefinition von »struct ifreq«
/usr/include/net/if.h:176: Fehler: Redefinition von »struct ifconf«

Wie umgeht man eine solche Doppeldeklaration, wenn man doch unbedingt beide Bibliotheken benötigt??

Danke, Herakles
 
Schon mal versucht eine auszukommentieren? Ich weis das ich keine große leuchte bin in sachen programmieren, aber ein versuch ist es wert.
 
Eigentlich sollte ein Makro in der Library automatisch verhindern, dass sie mehrmals geladen wird.
 
Jo eigendlich schon, aber wie in diesem vorliegenden Falle scheint das Macro nicht zu reagieren
 
Jo eigendlich schon, aber wie in diesem vorliegenden Falle scheint das Macro nicht zu reagieren

Genau so ist es wohl. Auskommentieren habe ich probiert und in dem Falle muss ich alle Programmteile, die auf die library if_fddi.h zugreifen (natürlich) löschen. Kompilieren ist in dem Falle zwar gegeben, aber von Funktionialität kann natürlich keine Rede mehr sein...

Herakles
 
Kannst Du mal den Header <linux/if.h> hier reinstellen?

Die Header-Datei sollte mit

#ifndef __IF_H__
#define __IF_H__

o. ä. beginnen und mit

#endif // __IF_H__

o. ä. enden.

Ist das gegeben?
 
Code:
#ifndef _NET_IF_H
#define _NET_IF_H	1

#include <features.h>

#ifdef __USE_MISC
# include <sys/types.h>
# include <sys/socket.h>
#endif

Das steht im Kopf. Reicht das an Information?

Herakles
 
Da ist der erste Fehler, den solltest Du beseitigen, bevor Du nach der Ursache der andern Fehlern suchst.

Hmm... Aber wie soll ich denn das tun? Das ist doch innerhalb des Kernelsources, also da (sollte) ich gar nicht dran herumpfuschen, das SOLLTE eigentlich so funktionieren...

Include ich nur eine der beiden Bibliotheken und kommentiere den restlichen Teil meines Programms, der die auskommentierte Bibliothek benötigt aus, funktionert alles prächtig, aber ich glaube, das habe ich schon einmal weiter oben geschrieben, richtig?

Herakles
 
Code:
#ifdef __USE_MISC
/* Standard interface flags. */
enum
  {
    [B]IFF_UP = 0x1,		/* Interface is up.  */           ZEILE 45!!!!!!!!!!!!!!![/B]
# define IFF_UP	IFF_UP
    IFF_BROADCAST = 0x2,	/* Broadcast address valid.  */
# define IFF_BROADCAST	IFF_BROADCAST
    IFF_DEBUG = 0x4,		/* Turn on debugging.  */
# define IFF_DEBUG	IFF_DEBUG
    IFF_LOOPBACK = 0x8,		/* Is a loopback net.  */
# define IFF_LOOPBACK	IFF_LOOPBACK
    IFF_POINTOPOINT = 0x10,	/* Interface is point-to-point link.  */
# define IFF_POINTOPOINT IFF_POINTOPOINT
    IFF_NOTRAILERS = 0x20,	/* Avoid use of trailers.  */
# define IFF_NOTRAILERS	IFF_NOTRAILERS
    IFF_RUNNING = 0x40,		/* Resources allocated.  */
# define IFF_RUNNING	IFF_RUNNING
    IFF_NOARP = 0x80,		/* No address resolution protocol.  */
# define IFF_NOARP	IFF_NOARP
    IFF_PROMISC = 0x100,	/* Receive all packets.  */
# define IFF_PROMISC	IFF_PROMISC

    /* Not supported */
    IFF_ALLMULTI = 0x200,	/* Receive all multicast packets.  */
# define IFF_ALLMULTI	IFF_ALLMULTI

    IFF_MASTER = 0x400,		/* Master of a load balancer.  */
# define IFF_MASTER	IFF_MASTER
    IFF_SLAVE = 0x800,		/* Slave of a load balancer.  */
# define IFF_SLAVE	IFF_SLAVE

    IFF_MULTICAST = 0x1000,	/* Supports multicast.  */
# define IFF_MULTICAST	IFF_MULTICAST

    IFF_PORTSEL = 0x2000,	/* Can set media type.  */
# define IFF_PORTSEL	IFF_PORTSEL
    IFF_AUTOMEDIA = 0x4000	/* Auto media select active.  */
# define IFF_AUTOMEDIA	IFF_AUTOMEDIA
  };

Zeile 45 habe ich mal ein wenig markiert...


Herakles
 
linux/if.h und net/if.h definieren beide IFF_UP, IFF_BROADCAST, etc. -- linux/if.h als Präprozessormakros, net/if.h als enum. Insofern hattest Du doch Recht :)

Du kannst entweder mit der Reihenfolge der #include Anweisungen spielen, so dass net/if.h vor linux/if.h eingebunden wird oder schauen, weshalb __USE_MISC bei Dir definiert ist.
 
Zurück
Oben