Komischer Fehler



  • Hallo !

    Hab so etwas noch nie gehabt, aber ich weiß nicht was ich vergessen habe oder falsch mach, programmiere eig. schon länger...

    Also ich habe eine main.c eine test.h und test.c Datei, wie üblich beinhaltet test.h die Deklarationen zu den Funktionen und test.c die Implementation, in main.c wird die test.h included, und wenn ich dann aber versuch eine Funktion aus test.c auszuführen kommt immer der Fehler "undefined reference to `func(int)' " Funktion heißt testfunc.

    Liegt das am neuen Code::Blocks Editor ?? Hab bis jetzt immer mit dem Alten gearbeitet und so einen Fehler hatte ich bis jetzt noch nie...



  • Hi!

    Vielleicht solltest du mal den Code posten. Vielleicht könne wir dir dann helfen. Am Editor alleine wirds wahrscheinlich nicht liegen (ausschließen kann ichs aber nicht, da Code::Blocks ja nicht nur Editor ist sondern eine Entwicklungsumgebung).

    Lg THE_ONE



  • Der Code ist etwas groß, ich schreib nur die wichtigen Sachn ok?

    Die main.c, erstellt ein Fenster mit der Winapi, und in der CALLBACK-function greife ich auf die Funktion zu, die mittels *.h eingebunden wird.

    main.c

    #define _WIN32_IE 0x300
    #include <windows.h>
    #include <windowsx.h>
    #include <commctrl.h>
    
    #include "main.h"
    #include "resource.h"
    #include "functions.h"   //Hier ist die Funktion test() deklariert
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    ...
    ret = test();
    ...
    }
    

    functions.h

    int test();
    

    functions.c

    int test() {
    
       return 12414;
    }
    


  • Wenn ich die functions.h und functions.c in einem Konoslenprogramm einbinde und funktioniert alles wunderbar, aber beim GUI WIN32 funktionierts nicht, auch wenn ich die Funktion außerhalb der CALLBACK funktion aufrufe funktioniert es nicht.



  • Was ich vielleicht noch dazu sagen sollte, die Funktions.c und Funktions.h Datei hab ich zuerst in einem Konsolenprogramm geschrieben, und danach in das WIN32 GUI Projekt eingefügt.



  • Hab das Problem jetzt gelöst, obwohl alle Datein eine *.c -Endung haben, muss man die test.h deklaration so schreiben:

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int test();
    
    #ifdef __cplusplus
    }
    #endif
    

    würde ich nur extern "C" davor schreiben ohne die direktiven, funktioniert es auch nicht, da meckert der Compiler wegen einem Syntaxfehler bei extern "C" mit direktiven funktionierts, komisch... ist das nur bei der IDE so oder überall ??



  • Deine "Lösung" bewirkt überhaupt nur etwas, wenn du deinen Code durch einen C++-Compiler jagst. Warum tust du das?



  • Das versuche ich schon ganze Zeit rauszufinden, ich finde bei Code::Blocks keine Option wo man angeben kann ob C oder C++ Compiler benutzt werden soll, ich dachte die IDE ist so "klug" und nimmt bei *.c Dateien automatisch den C-Compiler, aber so wie es aussieht werden beide verwendet, für die main.c wird der C++ Compiler, und für die functions.h und functions.c wird ein C-Compiler verwendet. Das liegt wohl daran, dass die IDE ein GUI-Projekt automatisch mit einer C++ Datei erstellt, diese hab ich dann zu einer .c umbenannt, und wie gesagt dachte ich, dass die IDE dann automatisch den C Compiler nimmt.

    In den Buid Options finde ich keine Einstellungen welchen Compiler er verwenden soll, hab zu Testzwecken ein C Projekt und ein C++ Projekt erstellt, und bei beiden sind die Einstellungen gleich 😕 😕



  • Also ich musste da jetzt auch erstmal danach suchen, normalerweise passt das bei mir immer wenn ich bei der Projekterstellung C oder C++ auswähle.

    Rechtsklick auf die betreffende Datei
    Properties
    Advanced
    Compiler variable

    Da "CC" statt "CPP" eintragen, sollte den gewünschten Effekt verursachen.



  • DANKE ! Hab das CC schon oft gesehen bei den Dateien, aber mir ist das CPP nie aufgefallen bei der main.c, hätt da noch eine Woche gesucht, großes dankeschön !!! 🙂 🙂


Anmelden zum Antworten