Eigene Bibliotheken einbinden
-
WTF!
Es liegt an der Reihenfolge der Einbindung. Bisher hatte ich zuerst Allegro, und dann CppGui eingebunden( beide aus "lib" ), wenn ich die beiden vertausche( also erst CppGui und dann Allegro ), dann gehts.
Nur warum? CppGui basiert auf Allegro. Deswegen müsste doch eigentlich Allegro vor CppGui eingebunden werden. Bzw. werden ja beim Linken nur die Funktionen aus Bibliotheken ergänzt, wieso spielt die Reihenfolge da überhaupt eine Rolle?
-
ChristophLu schrieb:
WTF!
Es liegt an der Reihenfolge der Einbindung. Bisher hatte ich zuerst Allegro, und dann CppGui eingebunden( beide aus "lib" ), wenn ich die beiden vertausche( also erst CppGui und dann Allegro ), dann gehts.
Nur warum? CppGui basiert auf Allegro. Deswegen müsste doch eigentlich Allegro vor CppGui eingebunden werden. Bzw. werden ja beim Linken nur die Funktionen aus Bibliotheken ergänzt, wieso spielt die Reihenfolge da überhaupt eine Rolle?
Weil der Linker die Bibliotheken in der angegebenen Reihenfolge durchgeht. Mir ist der tiefere Sinn dahinter jedoch auch nicht klar. Vermutlich liegt es am Ressourcenverbrauch. Man könnte so auch auch Mehrdeutigkeiten auflösen, falls ein Symbol in mehreren Bibliotheken vorkommt, aber das kommt mir eher wie eine theoretische Möglichkeit vor.
-
Jetzt wollte ich in Code::Blocks ein Projekt mit der GUI starten, nach dem ich dachte, das Problem sei gelöst. Denkste ...
Code::Blocks starten
File > New > Projekct...
Empty Projekt
Projekt > Build-Options -> erst CppGui und danach liballeg einbinden
Testquellcode schreiben
kompilierenFelermeldungen:
C:\Dev-Cpp\Bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\include\c++\3.4.2\bits\stl_iterator_base_types.h||undefined reference to `mcount'| C:\...\document.cpp|43|undefined reference to `mcount'| C:\...\document.cpp|43|undefined reference to `mcount'| C:\...\document.cpp|78|undefined reference to `mcount'| undefined reference to `mcount'| more undefined references to `mcount' follow| ||=== Build finished: 6 errors, 0 warnings ===|
Offenbar stehen also in der Bibliothek die Pfade zu den Quelldateien( "document.cpp" ist eine von CppGui ). Doch nirgends an der stelle( Zeile 43 oder 78 ) steht etwas von "mcount".
Was soll das?
-
So. Ich hab mal gegoogelt und hab rausgefunden, das "mcount" etwas mit dem Debugging-Flag( -g ) beim GCC zu tun hat. Ich hab mir mal das Makefile der CppGui angeguckt und hab dann -lgmon, -pg und -g rausgenommen. Erstaunlich war, das die Libary jetzt nicht mehr 5000 KB sondern nur noch 200 KB groß war.
Ich denke mal, ich hab das Problem jetzt im Griff. Zumindest funktioniert jetzt alles so, wie ich will
-
Hallo,
Wieso nimmst du denn nicht die Release-Version deiner CppGUI?, oder hast du eine extra Debugversion erstellt?
Gruß Simon
-
Ich hab gar nix mit Release/Debug eingestellt, das hab ich gerade eben erst mitbekommen. War anscheinend so ein Standartt-Dings von DevCpp, oder ich habs unwissentlich mal aktiviert.
-
Hi. Hab ein kleines Problem mit meinem C++-Programm. Es klappt einfach nicht, die #include-Direktive zu benutzen. Also die vorgefertigten wie <iostream>, <cstdlib> usw. sind gar kein Problem, aber wenn ich eigene Quelldateien einbinden will, klappt das nicht. Wollte mir z.B. in einer Datei verschiedene Funktionen programmieren, die ich dann in anderen Programmen immer nutzen kann.
Einfaches Bsp.: (geht ja nur ums Prinzip)Programm "math"
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;int quadrat(int zahl);
int main(int nNumberofArgs, Char* pszArgs[])
{
int value = 4;
cout << quadrat(4) << endl;
system("PAUSE");
return 0;
}int quadrat(int zahl)
{
return zahl * zahl;
}In einem anderen Programm hab ich dann einfach oben dazugeschrieben:
#include "math"
und wollte dann die Funktion quadrat benutzen. Dann kam zuerst die Fehlermeldung "no such file". Dann hab ich geschrieben "math.cpp", da kam etwas von "redefinition". Ich hab mich noch gefragt, ob die include-Datei eigentlich ne eigene main-Funktion haben kann, weil die dann ja quasi doppelt ist. Aber damit bin ich auch nicht weiter gekommen. Habe Dev-C++ und Windows XP und programmiere erst seit 2-3 Wochen, also sorry wenn mein Problem übelst einfach zu lösen ist. Bin dankbar für jede Hilfe. lg stef
-
meinmath.h
#ifndef MEINMATH_H // Headerguards (siehe Google) #define MEINMATH_H int quadrat(int zahl); // Funktionsdeklaration in den Header schreiben #endif // MEINMATH_H
meinmath.cpp
#include "meinmath.h" int quadrat(int zahl) // Funktionsdefinition in eine Sourcedatei schreiben { return zahl * zahl; }
irgendeine.cpp
// Um die Funktion in einer anderen Sourcedatei zu verwenden, // den entsprechenden Header einbinden und die Funktion einfach aufrufen #include "meinmath.h" /* ... */ int i = 10; int j = quadrat(i); /* ... */
Das sollte aber auch in jedem Anfängerbuch zu finden sein
-
Hm, also ich hab mir C++ für Dummies gekauft und komm damit auch einigermaßen zurecht (hab allerdings noch mehr Probleme als mit der #include-Direktive)
Aber von Headerguards und #ifndef ... steht da gar nichts. Ich hab das jetzt mal alles so eingegeben. Die erste Quelldatei hab ich unter meinmath.h gespeichert und die zweite unter meinmath.cpp. Das funktionierte auch problemlos. Als ich dann aber in einer neuen Quelldatei die Funktion einbinden wollte, kam folgende Fehlermeldung:
C:\DOKUME1\Besitzer\LOKALE1\Temp\cc23aaaa.o(.text+0x2c)
[Warning] In functionmain': [Linker error] undefined reference to
quadrat(int)'
Damit kann ich nur leider nichts anfangen.
-
Du mußt auch noch die "meinmath.cpp" dem Projekt hinzufügen (denn sonst kann der Linker die Definition der Funktion ja nicht kennen).
P.S: Warum hast du denn nicht einen eigenen Thread für deine Frage aufgemacht, sondern in dieser von ChristopherLu?
-
Oh sorry, tut mir leid, ich wusst nicht, dass ich hier irgendwo reinplatze. Bin durch google auf die Seite gekommen und dachte hier kann mir vielleicht jemand helfen. Es klappt aber immer noch nicht. Jetzt kommen Fehlermeldungen mit Build Error und "overloading old commands" und so. Naja, wenn nich beschäftige ich mich erstmal wieder mit einfacheren Sachen. (auch wenn so eine include-Datei für euch vielleicht auch Babykram ist.) Vielen Dank für alle Hilfe. Und nochmal sorry für die Störung
-
stefx082 schrieb:
Hm, also ich hab mir C++ für Dummies gekauft und komm damit auch einigermaßen zurecht (hab allerdings noch mehr Probleme als mit der #include-Direktive)
Aber von Headerguards und #ifndef ... steht da gar nichts.Das Buch ist auch nicht allzu gut... Wenn ich mich recht erinnere, wird da von
<iostream.h>
undvoid main()
gesprochen, ich kann mich aber auch täuschen.Zu deinem Problem: Du musst die Quelldateien (.cpp) auch zu deinem Projekt hinzufügen, wenn du willst, dass sie kompiliert werden. Von Vorteil ist es auch, wenn sich alle Dateien im gleichen Verzeichnis befinden.
-
Es hat funktioniert! Yes. Mir ist zwar immernoch nicht ganz klar, was ein Headerguard ist und was #ifndef ... bedeutet, aber das ist mir grad egal. Vielen Dank für eure Hilfe. Was C++-für Dummies angeht, also ich finde es wie gesagt relativ Ok. Hab es immerhin hinbekommen, mit 2,3 Wochen Programmiererfahrung ein Programm zu schreiben, dass Sudokus löst.(keine Ahnung ob das nun gut oder eher normal ist) Nur was die #include-Direktiven angeht, kann man das Buch echt vergessen. Da stand nur, dass die Erweiterung .h überholt und nicht mehr benutzt wird (was ja anscheinend nicht stimmt) und von Headerguards und #ifndef... ist auch nichts zu finden. Naja, jetzt weiß ich ja trotzdem erstmal so ungefäjr, wies funktioniert. Danke lg stef
-
Stefx082 schrieb:
Da stand nur, dass die Erweiterung .h überholt und nicht mehr benutzt wird (was ja anscheinend nicht stimmt)
Definitiv nicht. Aber solche Aussagen sind ein mögliches Anzeichen dafür, dass der Autor sich (zumindest in einigen Bereichen) nicht sehr auskennt. Du kannst auch mit dem Buch C++ lernen, aber vermutlich wirst du danach einige Details falsch in Erinnerung haben. Ist ja nicht tragisch, bedenke einfach, dass du um sicherzugehen noch andere Quellen berücksichtigen solltest.
Vielleicht ist der C++-Primer oder Thinking in C++ eine gute Ergänzung. Letzteres ist auch gratis als Online-PDF verfügbar. Zusätzlich kannst du dir auch ein Tutorial wie http://www.cplusplus.com/doc/tutorial/ oder http://tutorial.schornboeck.net/inhalt.htm anschauen.