Ich finde den Fehler nicht: multiple definition of



  • Hallo!

    Vermutlich was ganz offensichtliches, aber ich komme nicht drauf.

    In meinem Code habe ich in Checkmesh_Typedefs.h meine Typen und Makros definiert.

    /*--------------------------------------------------------------------------*/
    #define Color_OK           0  /* Weiss */
    #define Color_TSkew        1  /* Gruen */
    #define Color_QSkew        2  /* Blau */
    #define Color_QAngle       3  /* Gelb */
    #define Color_CrashTime   14  /* Magenta */
    #define Color_TAngle       5  /* Rot */
    #define Color_Warp         6  /* Tuerkis */
    #define Color_AspRat       7  /* Orange */
    #define Color_Pink         8  /* Rosa */
    #define Color_Violett      9  /* Violett */
    #define Color_LightGreen   10 /* Hellgruen */
    #define Color_Taper        11 /* Braun */
    #define Color_Nester       12 /* Khaki */
    #define Color_Gray         13 /* Grau */
    #define Color_Multi        14 /* Gruenbraun */
    #define Color_DarkGray     15 /* Dunkelgrau */
    #define ELEMENT_SET_TYP    3
    #define CHECK_SET          1
    
    //
    #define TRIA_ELEM          3
    #define QUAD_ELEM          4
    //
    #define STARTFUNC  if (Debug) printf("Start >%s< in line %i\n",__FUNCTION__,__LINE__)
    //
    /*--------------------------------------------------------------------------*/
    
      typedef struct{
        int ID;
        int AnzTria;
        int AnzElem;
        double Area;
        double MinLen;
        double MaxLen;
        double AvgLen;
      } Type_Property;
    
       Type_Property* Property = NULL;
    // und noch mehr...
    

    Diese habe ich im Hauptprogramm mit

    #include "Checkmesh_Typedefs.h"
    

    eingebunden.
    Soweit gut.

    Wenn ich nun eine weitere Funktion erstelle und diese im Hauptprogramm includiere dann meckert der Compiler, dass die Funktion die Makros nicht kennt.
    Auch i.O.

    Wenn ich aber in die Funktion die typedefs.h einbinde, dann bekomme ich plötzlich die Meldung, dass meine Typdefinitionen doppelt sind.

    In file included from SetLimits.c:19:
    /tmp/ccORegUZ.o: In function SetLimits': /home/brunsj/01\_Software/01\_Medina/11_DynCmd/Checkmesh/SetLimits.c:48: multiple definition ofProperty'
    /tmp/ccKMpBYr.o:/home/brunsj/01_Software/01_Medina/11_DynCmd/Checkmesh/Checkmesh_V5.1.c:441: first defined here
    /

    Ich habe den kompletten Code durchgegrept und es gibt nur in der typedefs.h Typdefinitionen

    Besonders doof ist, daß die Zeilen, in denen der Compiler die doppelten Definitionen findet sich auf den Code nach dem Preprocessing beziehen.
    Mit -E komme ich auch nicht weiter, weil sich in den angemeckerten Zeilen kein typedef findet.

    Was mache ich falsch?

    Ciao

    OkkaPapa



  • Dir fehlt ein Include - Guard:

    #ifndef TYPEDEFS_H
    #define TYPEDEFS_H

    //Hier Deine oben genannten Definitionen

    #endif



  • OkkaPapa schrieb:

    Was mache ich falsch?

    Du definierst Variablen im Header.

    Dadurch, dass du den Header in SetLimits.c und in Checkmesh_V5.1.c einbindest, hast du in beiden eine Variable namens Property. Der Linker kann nicht wissen, welche Definition er nehmen soll.

    Eigentlich willst du nur eine einzige Definition. Dazu musst du die Definition im Header in eine Deklaration umwandlen (indem du extern davor schreibst), und die Definition in einer .c-Datei machen.



  • Die Zeile 39 aus deinem obigen Code kopierst du in eine .c Datei.
    Welche Datei das ist, musst du wissen.
    Muss sie überhaupt global sein ?

    Die Zeile 39 änderst du in extern Type_Property* Property;

    Das gilt auch für die anderen Variablendefinitionen.

    In eine Headerdatei kommen keine Variablen- oder Funktionsdefinitionen sondern nur Deklarationen.²

    ²Ausnahmen gibt es nur für Fortgeschrittene.



  • Belli schrieb:

    Dir fehlt ein Include - Guard:

    Das stimmt, aber löst nicht das genannte Problem.



  • Es löst nicht die in der Folge angesprochenen Linker-Probleme. Wenn ich den TE aber richtig verstehe, hat er zunächst mal ein Compiler-Problem ...



  • Belli schrieb:

    Es löst nicht die in der Folge angesprochenen Linker-Probleme. Wenn ich den TE aber richtig verstehe, hat er zunächst mal ein Compiler-Problem ...

    Das ist sein Problem:

    In file included from SetLimits.c:19:
    /tmp/ccORegUZ.o: In function SetLimits': /home/brunsj/01\_Software/01\_Medina/11_DynCmd/Checkmesh/SetLimits.c:48: multiple definition ofProperty'
    /tmp/ccKMpBYr.o:/home/brunsj/01_Software/01_Medina/11_DynCmd/Checkmesh/Checkmesh_V5.1.c:441: first defined here
    /

    Das ist eine Linkerfehlermeldung.



  • DirkB schrieb:

    Die Zeile 39 aus deinem obigen Code kopierst du in eine .c Datei.
    Welche Datei das ist, musst du wissen.
    Muss sie überhaupt global sein ?

    Die Zeile 39 änderst du in extern Type_Property* Property;

    Das gilt auch für die anderen Variablendefinitionen.

    In eine Headerdatei kommen keine Variablen- oder Funktionsdefinitionen sondern nur Deklarationen.²

    ²Ausnahmen gibt es nur für Fortgeschrittene.

    Hallo!

    Damit hats geklappt.

    Seltsam ist nur, daß ich in einem anderen Projekt Definition und Deklaration in einer Headerdatei hatte und das keine Probleme gab... hab mich halt für einen Fortgeschrittenen gehalten 😃

    Unterschied zu diesem Projekt ist, daß ich diesmal eine API habe und in dem anderen Projekt wars standalone.

    Trotzdem danke an alle!

    Ciao

    OkkaPapa



  • OkkaPapa schrieb:

    Seltsam ist nur, daß ich in einem anderen Projekt Definition und Deklaration in einer Headerdatei hatte und das keine Probleme gab...

    Wie oft wurde der Header denn eingebunden?

    OkkaPapa schrieb:

    hab mich halt für einen Fortgeschrittenen gehalten 😃

    Erst wenn du das nicht mehr machst, bist du es. 😉

    ~Ich weiß, dass ich nichts weiß~


Anmelden zum Antworten