Seite 1 von 2 12 Letzte »
Ergebnis 1 bis 20 von 22

[C++] Dateien mit Code::Blocks verlinken

  1. #1 Zitieren
    Provinzheld
    Registriert seit
    Nov 2012
    Beiträge
    249
    Hallo!

    Ich habe ein neues Projekt in der CodeBlocks IDE mit drei Dateien erstellt, und versuche daraus eine ausführbare Datei zu gewinnen.

    Die Dateien bestehend aus zwei cpp-Dateien und einer h-Datei, habe ich alle im selben Verzeichnis abgespeichert:

    // a.cpp
    #include "b.h"

    main(){}


    // b.h
    #ifndef B_INCLUDED
    #define B_INCLUDED

    int func(int);
    #endif


    //c.cpp
    #include "b.h"

    int func(int a) {
    return a+1;
    }



    Wenn ich nun versuche das Projekt zu "builden", bekomme ich die Fehlermeldung:
    Linking stage skipped (build target has no object files to link)
    Wenn ich die c.cpp Datei mittels
    "Build -> Compile current file" versuche zu einer o-Datei zu kompilieren, meckert der Compiler rum dass er keine main()-Funktion findet.

    Kennt sich hier vielleicht jemand mit Code:locks aus, und weiß wie das Projekt hier zum laufen kriege? Ich habe auch einen einfachen Kommandozeilencompiler installiert (MinGW). Wenn jemand wüsste wie ich mit dem aus den drei Dateien eine exe-Datei erstelle, würde mir das auch enorm weiter helfen.






    Tevez ist offline Geändert von Tevez (06.12.2012 um 21:44 Uhr) Grund: #endif

  2. #2 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    1. deine code tags sind extrem durcheinander, mach die ma ordentlich...

    2. klar findet der keine main funktion, es existiert ja auch keine(in der c.cpp),und der in der a.cpp fehlt der rückgabetyp, void muss die schon minimum sein(besser int udn dann 0 zurükgeben)...

    3. das #endif gehört in die headerdatei. o wies ist machts nich wirklich sinn...

    4. welche verbindung soll die a.cpp zum rest haben? die hat ja außer der .h keine includes und kann garnichts, gibt nichts zurück, usw

    Daepilin ist offline Geändert von Daepilin (06.12.2012 um 21:33 Uhr)

  3. #3 Zitieren
    Provinzheld
    Registriert seit
    Nov 2012
    Beiträge
    249
    1. Ja, was der mit dem Codes hatte is mir auch ein Rätsel. Bin auf die quotes umgestiegen, auch wenns immer noch nicht so aussieht wie ich wollte..

    2. Die c.cpp soll eine einfache Implementationsdatei ohne main()-Funktion werden. Und bei der a.cpp.. naja, ich hab die main() funktion in CodeBlocks bisher immer ohne Rückgabetyp geschrieben. Bisher hatte der Compiler nie ein Problem damit, scheint das "int" automatisch nachzutragen.

    3. Jetzt richtig? Mein Code war etwas durcheinander

    4. Ich hatte die Idee erst die c.cpp zu c.o zu kompilieren, dann a.cpp zu a.o zu kompilieren und die beiden dann zu linken. Ich dachte wenn ich die h-Datei bei beiden "include" würde das hinhauen.
    Tevez ist offline

  4. #4 Zitieren
    Ritter Avatar von ojas
    Registriert seit
    Jun 2008
    Ort
    Erde
    Beiträge
    1.787
    Zitat Zitat von Tevez Beitrag anzeigen
    Ich habe auch einen einfachen Kommandozeilencompiler installiert (MinGW).
    1. a.cpp kompilieren:
      g++ -c a.cpp
    2. c.cpp kompilieren:
      g++ -c c.cpp
    3. a.o und c.o linken:
      g++ c.o a.o -o c.exe


    Eventuell musst du statt g++ den vollen Pfad zum Kompiler angeben, könnte aber auch sein, dass MinGW so installiert wurde, das Windows weiß, welches Programm gemeint ist.

    Tradionelle Dateiendung für Objektdateien ist .o. Windows verwendet dagegen oft .obj. Schau mal nach was in den ersten zwei Schritten erzeugt wird und passe die Dateinamen im dritten Schritt entsprechend an.
    ojas ist offline Geändert von ojas (06.12.2012 um 22:15 Uhr)

  5. #5 Zitieren
    Provinzheld
    Registriert seit
    Nov 2012
    Beiträge
    249
    Ich habs grad versucht und es hat geklappt! Also beim ersten Versuch.. Dann hab ich eine Programmänderung gemacht weil mir das Konsolenfenster zu schnell weg ging und seit dem rückt er bei jedem Versuch mit ner neuen Fehlermeldung raus..
    Ich brauch wohl grad noch ein paar Anläufe.
    Tevez ist offline

  6. #6 Zitieren
    Provinzheld
    Registriert seit
    Nov 2012
    Beiträge
    249
    Alles klar, es hat funktioniert. Danke ojas!
    Wäre toll wenn noch jemand weiß was ich mit Code Blocks falsch mache. Aber wahrscheinlich ist es einfach ein ziemlich dummer Fehler von mir. Mal sehen
    Tevez ist offline

  7. #7 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    was bekommst du den für fehler?

    Vor allem macht das programm so wie es da steht ja nichts was irgendwie angezeigt wird.

    das schließen könntest du z.B. mit

    Code:
    std::cin.get();
    std::cin.get();
    in der main funktion verhindern, wobei du dazu die iostream includieren musst. (#include<iostream>).
    das std:: gibt den namensraum an, um das wegzulassen packst du direkt hinter den include ein using namespace std;

    ( da gehört immernoch n int + rückgabewert zu, zumindest hab ich es noch absolut nie anders gesehen. das betriebssystem will halt wissen ob alles gut gegangen ist, udn dafür erwartet es den rückgabewert 0)

    Daepilin ist offline Geändert von Daepilin (06.12.2012 um 22:55 Uhr)

  8. #8 Zitieren
    Provinzheld
    Registriert seit
    Nov 2012
    Beiträge
    249
    Ich hab jetzt das cin eingefügt und die main-Datei so abgeändert

    #include "b.h"
    #include <iostream>

    int main(){
    int l;
    std::cout << func(5);
    std::cin >> l;
    }

    Hat auf der Konsole korrekterweise 6 ausgegeben. Es läuft also wirklich. Nur bei CodeBlocks bin ich noch am rumprobieren
    Tevez ist offline

  9. #9 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    du musst keine variable einfügen. du kannst wie gesagt einfach cin.get() aufrufen (aber 2 mal).

    und wenn du int main() schreibst musst du mit return 0; am ende der main funktion (aber vor }) 0 zurückgeben

    sind die dateien bei codeblocks alle auch richtig im projekt eingefügt? hab neulich erst was in codeblocks mit mehreren quelldateien geschrieben, das ging ohne, dass ich irgendwas hätte ändern müssen.

    Daepilin ist offline

  10. #10 Zitieren
    Provinzheld
    Registriert seit
    Nov 2012
    Beiträge
    249
    Anscheinend irgendwie nicht. Ich mach es so dass ich ein neues Projekt erstelle, dann über File->New->Empty File eine neue File, die ich dann unter .cpp oder .h abspeichere, und im darauffolgenden Dialog wähl ich dann bei "Select the targets this file should belong to" die Kästchen Debug und Release aus. Zumindest glaub ich dass ich es so gemacht hab, aber dass muss ich gleich nochmal ausprobieren
    Tevez ist offline

  11. #11 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    die kästchen sind standardmäßig aktiv, hast du die vielleicht deaktiviert?

    Daepilin ist offline

  12. #12 Zitieren
    Provinzheld
    Registriert seit
    Nov 2012
    Beiträge
    249
    Nö, ich muss sie immer erst ankreuzen.
    Tevez ist offline

  13. #13 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    irgendwie is deine codeblocksinstallation seltsamm oO was wählst du denn für nen projekttypen aus?

    Daepilin ist offline

  14. #14 Zitieren
    Provinzheld
    Registriert seit
    Nov 2012
    Beiträge
    249
    Immer "Empty Project". Im darauffolgenden Dialog sind dann bei mir "create Debug configuration" und "create Release configuration" aktiviert.
    Tevez ist offline

  15. #15 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    hast dus mal mit win32 konsolenanwendung als typ probiert?

    ich hab codeblocks hier auf dem rechner nich installiert um das zu probieren, aber da sollte es auf jeden fall gehen.

    Daepilin ist offline

  16. #16 Zitieren
    Provinzheld
    Registriert seit
    Nov 2012
    Beiträge
    249
    Ich find bei mir nur "Console Application" zur Auswahl. Werd's damit mal probieren
    Tevez ist offline

  17. #17 Zitieren
    Provinzheld
    Registriert seit
    Nov 2012
    Beiträge
    249
    Es hat wirklich geklappt . Danke dir!
    Hab allerdings keine Ahnung warum das mit Console Project auf einmal einen Unterschied macht.. naja.
    Tevez ist offline

  18. #18 Zitieren
    Provinzheld Avatar von Cheesecake
    Registriert seit
    Feb 2012
    Beiträge
    266
    Zitat Zitat von Daepilin Beitrag anzeigen
    und wenn du int main() schreibst musst du mit return 0; am ende der main funktion (aber vor }) 0 zurückgeben
    Nö, muss man nicht. Also int als Returnwert muss sein, aber das 'return 0;' kann man bei der main weglassen.
    Cheesecake ist offline

  19. #19 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    Zitat Zitat von Cheesecake Beitrag anzeigen
    Nö, muss man nicht. Also int als Returnwert muss sein, aber das 'return 0;' kann man bei der main weglassen.
    also ich hab immer gehört und in tutorials gelesen, dass das schlechter stil sei. in der uni vorlesung hat unser dozent auch nie erwähnt, dass man es weglassen kann.

    Daepilin ist offline

  20. #20 Zitieren
    Krieger Avatar von Lain
    Registriert seit
    Oct 2008
    Beiträge
    409
    Zitat Zitat von Daepilin Beitrag anzeigen
    also ich hab immer gehört und in tutorials gelesen, dass das schlechter stil sei. in der uni vorlesung hat unser dozent auch nie erwähnt, dass man es weglassen kann.
    Je nachdem, wie "streng" der Compiler eingestellt ist, wäre es sogar falsch ohne return. Der Compiler nimmt als default zwar an, dass "int" verwendet und dementsprechend auch zurückgegeben wird, aber je nach Flags gibts auch eine Warnung.

    Unser Dozent hat mal formuliert, man könne anhand der main in einem C/C++ Buch sofort erkennen, ob der Autor weiß, wovon er schreibt oder nicht und das Buch ggf. wegwerfen
    Lain ist offline

Seite 1 von 2 12 Letzte »

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •