Compiler macht große Probleme



  • Hallo,
    und zwar wenn ich mein Projekt immer compilen will erhalte ich folgende Fehlermeldung:

    ork.obj : error LNK2005: _counter already defined in irc.obj
    ork.obj : error LNK2005: _channelpass already defined in irc.obj
    ork.obj : error LNK2005: _channel already defined in irc.obj
    ork.obj : error LNK2005: _serverpass already defined in irc.obj
    ork.obj : error LNK2005: _port already defined in irc.obj
    ork.obj : error LNK2005: _server already defined in irc.obj
    ork.obj : error LNK2005: _logins already defined in irc.obj
    ork.obj : error LNK2005: _id already defined in irc.obj
    

    Bin schon ehrlich gesagt ein wenig verzweifelt.
    Wie beheben ich diese Fehlermeldungen?





  • Naja da jetzt immer "static" vor die Varibale zu schreiben ist ja aucht nicht wirklich ne Lösung.
    Ich habe eine Header Datei.
    Includes.h

    #include <stdio.h>
    #include <windows.h>
    #include <stdlib.h>
    #include <winsock.h>
    #include "config.h"
    

    Und in jeder .c Datei wird diese includes.h eingebunden.
    In der config.h sind alle meine Variablen.





  • benutz du

    #pragma once
    

    in deinen Headerdateien bzw. in jeder Headerdatei?



  • joggel schrieb:

    benutz du

    #pragma once
    

    in deinen Headerdateien bzw. in jeder Headerdatei?

    Das bringt ihn nicht weiter, denn das #pragma once von MFC erlaubt trotzdem eine Mehrfachdeklaration von Klassen.

    #ifndef ist die Lösung - besonders in MFC muss man hin und wieder auf Standard-C zurückgreifen, weil es manchmal die einzig funktionierende Methode ist 😮


  • Mod

    tha_specializt schrieb:

    Das bringt ihn nicht weiter, denn das #pragma once von MFC erlaubt trotzdem eine Mehrfachdeklaration von Klassen.

    Aber es verhindert den include einer Header Datei zum zweiten mal.

    Und wieso hast Du eine Klasse mehrfach deklariert und nicht nur in einer Header datei? Dann wäre #pragma one nämlich genau die Lösung...



  • Ah wenn ich jetzt:

    #ifndef INCLUDES_H
    #include "includes.h"
    #endif
    

    Jetzt vor jede .c Datei setze geht alles ohne Probleme.
    Aber ist das wirklich die Lösung diesen kleinen Code vor jede .c Datei zu setzen?



  • Nein. Sondern Header Guards in die Header Dateien.
    Simon



  • Also #ifndef in jede einzelne H oder in die "includes.h"?



  • Einfach in jede Headerdatei die Includ-Guards.

    Also das, was du bereits erwähnt hast.


  • Mod

    Wurde auch schon gesagt: Einfach nur eine Zeile rein mit

    #pragma once
    

    und gut ists...



  • Gcc unterstützt das #pragma once doch bestimmt auch, oder?

    PS: Wer sich fragt, was diese Frage hier zu suchen hat, tut das zurecht! Ich dachte, ich wäre im C++-Forum -.- Kaffee her!



  • Funktioniert nicht:

    Compiling...
    test.c
    f:\test\includes.h(2) : warning C4182: #include nesting level is 363 deep; possible infinite recursion
    f:\test\includes.h(2) : fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit
    test_connect.c
    f:\test\includes.h(2) : warning C4182: #include nesting level is 363 deep; possible infinite recursion
    f:\test\includes.h(2) : fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit
    Error executing cl.exe.
    

    Funktioniert genauso wenig wie pragma once....



  • Kann es sein, dass du hier eine Library linkst und die bereits zuvor gelinkt wurde?

    Gruss Kimmi



  • Hatte das selbe Problem.
    Auch wenn das keine sehr elegante Lösung ist: Ein /FORCE:MULTIPLE wirkt Wunder 😃



  • Lupinius schrieb:

    Hatte das selbe Problem.
    Auch wenn das keine sehr elegante Lösung ist: Ein /FORCE:MULTIPLE wirkt Wunder 😃

    Ist das nicht Symptombekämpfung?
    Simon



  • VC6 schrieb:

    Funktioniert nicht:

    Compiling...
    test.c
    f:\test\includes.h(2) : warning C4182: #include nesting level is 363 deep; possible infinite recursion
    f:\test\includes.h(2) : fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit
    test_connect.c
    f:\test\includes.h(2) : warning C4182: #include nesting level is 363 deep; possible infinite recursion
    f:\test\includes.h(2) : fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit
    Error executing cl.exe.
    

    Funktioniert genauso wenig wie pragma once....

    Du musst das #pragma once bloss ganz oben im Header-File hinschreiben 🙄



  • Wieder eine Fehlermeldung wenn ich #pragma once benutze:

    connect.obj : error LNK2001: unresolved external symbol _serverpass
    test.obj : error LNK2001: unresolved external symbol _port
    testobj : error LNK2001: unresolved external symbol _server
    


  • Ok das Projekt lässt sich jetzt ohne Probleme erstellen.
    Doch jetzt gibt es wieder en Problem mim Compiler:

    F:\test.c(10) : warning C4013: 'connection' undefined; assuming extern returning int
    

    Und so sieht die connection() Funktion aus:

    int connection() {
    

    Und ich gebe folgendes zurück:

    return 1;
    

    Also was ist da jetzt wieder der Fehler?


Anmelden zum Antworten