Milupinchen
Anmeldungsdatum: 28. März 2016
Beiträge: Zähle...
|
Hallo, ich bin vor 3 Wochen von Windows auf Ubuntu umgestiegen und noch ziemlich jungfräulich, was die Möglichkeiten von Ubuntu angeht, vor allem die Terminalnutzung. Nun habe ich aber ein Problem, das ich seit Tagen nicht gelöst bekomme. Ich habe vom Professor an meiner Uni im Rahmen einer Vorlesung mehrere Codes bekommen, vor allem header-Dateien, sowie Objekt- und Quelldateien. Alles ist in C++ geschrieben. Als Editor möchte ich gern Anjuta nutzen, weil ich damit ganz gut zurecht komme. Nun teilt der Prof auf dem Übungsblatt mit, dass wir hauptsächlich mit einer header-Datei arbeiten werden. Nur bekomme ich diese Datei nicht in mein Projekt eingebunden. Und da ich auch in C++ wenig Erfahrungen habe, die über normale Programmierung hinausgeht, bin ich etwas überfordert, was ich machen muss, was ich beachten sollte und was ich wohl übersehe. Zumindest scheiterten alle Versuche, die Dateien zu integrieren. Es kam immer die Meldung, dass die Datei oder das Verzeichnis nicht gefunden werden kann, egal, ob ich sie in den Projektordner kopiert hatte oder als Quelldatei hinzugefügt habe.... Kann mir da jemand helfen? Viele Grüße Sandra
|
eider
Anmeldungsdatum: 5. Dezember 2009
Beiträge: 6274
|
Willkommen, poste bitte bei Fehlermeldungen stets den Text vollständig im Codeblock.
|
Milupinchen
(Themenstarter)
Anmeldungsdatum: 28. März 2016
Beiträge: 7
|
Oh, ja, das hab ich in der Hektik total unterschlagen... VIelleicht sollte ich meine Frage umformulieren. WIe geht man denn grundsätzlich vor, wenn man vorhandenen Code in ein Projekt benutzen möchte?
Ich habe zB drei Dateien mit dem Namen "Array". Einmal als .cpp, einmal als .o und einmal als .h. Ich möchte gern die Funktionen im Header nutzen. Da stochere ich total im Nebel. Werden alle Dateien als Quelltexte eingebunden, aber nur der Header im Code eingebunden? Oder müssen die Dateien irgendwo an besonderer Stelle im Projektordner gespeichert werden, damit der Header eingebunden werden kann? Ich kenne es von Visual Studio noch so, dass die Dateien im Projektbaum direkt eingebunden wurden, und dann konnten sie eingebunden und die Methoden genutzt werden. Ich finde Ubuntu sehr ansprechend, aber im Moment bin ich total überfordert....und ich weiß auch nicht, wonach ich genau im Internet suchen muss oder woran ich erkenne, dass vielleicht noch was fehlt.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
In Deiner IDE hattest Du wahrscheinlich passende Voreinstellungen für Include-Path, Librarypath, Sourcepath ohne Dich drum kümmern zu müssen, und deswegen hast Du nie gelernt, was da vor sich geht. Gibt es Anjuta nicht auch für Windows? Kannst Du es unter Windows so einrichten, dass es tut was Du brauchst? Ich habe zwar noch Restwissen von C++ aber nie mit Anjuta gearbeitet. Kannst Du mit Makefiles umgehen und ein Makefile für Dein Projekt schreiben? Wenn Du das lernst kannst Du die passenden Einstellungen in allen IDEs vornehmen.
|
Milupinchen
(Themenstarter)
Anmeldungsdatum: 28. März 2016
Beiträge: 7
|
Ich habe vorhin makefile über das Terminal an einem kleinen Testprogramm versucht, aber bin erstmal gescheitert. Da schaue ich morgen nochmal genauer, denn die Eingabe über das Terminal finde ich sehr attraktiv. Da möchte ich unbedingt noch mehr reinkommen. Ich kann nur leider nicht in Windows arbeiten, da die Dateien vom Prof in Ubuntu erstellt wurden. Und ich möchte auch gerne mit Ubuntu lernen umzugehen, nur bin ich total überfragt, nach was ich speziell google oder mit was ich am Besten anfange?
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hi! Bevor du dich an sowas wagst, solltest du ggf. mal die Grundlagen mit einem Tutorial lernen. Also auf Konsole nen kleines Programm schreiben, dieses dann mit den nötigen Bibliotheken linken und kompilieren. Dazu gibt es haufenweise Tutorials, leider kann ich keines empfehlen. Jeder braucht etwas andere Erklärungen... Erstmal die Verzeichnisstruktur deines Ubuntus (oder anderer unixoider OS), danach was ist ein Linker? Was ein Compiler? Include-files? Usw. Ist erstmal viel input, aber du schaffst das schon ☺
|
Milupinchen
(Themenstarter)
Anmeldungsdatum: 28. März 2016
Beiträge: 7
|
Dann arbeite ich also erstmal mit Gedit und Terminal ☺ Danke!
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Hi Sandra, auch von mir ein "Willkommen" hier auf dem Forum ! Vielleicht ist der Einstieg über das anjuta-Tutorial das günstigste für Dich ... Du siehst dort:
den grundsätzlichen gcc- Befehl (→ für C++ käme dort allerdings ein g++ - Befehl hin !) - das ist so der Urschleim. wie man das dann in ein make- file einpacken kann - das wäre der Standardweg für größere Projekte auf der Konsole - und wie man den Krempel für Anjuta umsetzt. Das wird wahrscheinlich das sein, was Du in Euren Übungen nachher brauchst.
Lies Dich mal ein bisschen ein, auch bei uns im Wiki, probier selber damit herum und dann sehen wir mal weiter. LG, track
|
Milupinchen
(Themenstarter)
Anmeldungsdatum: 28. März 2016
Beiträge: 7
|
Hi 😉 Ich bin inzwischen bei Makefile angelangt und habe nun verstanden, was beim ersten Versuch, der im Rückblick unfassbar naiv war, nicht funktionieren konnte.Jetzt ist mir auch klar, dass Header die Klasse und die zugehörige cpp-Datei die Implementierung der Methoden in der Klasse beinhaltet. Und wo die o.-Datei herkommt, auch das macht jetzt natürlich Sinn. Auch der Unterschied der verschiedenen #include-Anweisungen ist mir jetzt sehr klar. Der Tipp, erstmal da anzufangen, war sehr, sehr hilfreich, danke an euch beiden! Inzwischen hab ich zur Probe mal selbst ein Beispiel nachprogrammiert und versuche nun zu verstehen, wie das allgemein umgesetzt wird. Bisher habe ich in meiner makefile-Datei die beteiligten Header- und cpp-Dateien einzeln organisiert. Nun ist es aber bei dem Code vom Prof so, dass wir mit einer Header-Datei arbeiten sollen. Diese Headerdatei bindet 2 weitere Header ein, die zugehörige cpp.-Datei sogar 8. Das Makefile dazu verstehe ich noch nicht ganz,weil ich noch nicht ganz hinter die Variablen gekommen bin, die benutzt werden. Meine Frage aber ist im Moment: Wenn ich mich selbst an einem makefile versuchen möchte, weil ich die Methoden des Headers testen will, muss ich dann alle beteiligten Header im selben Ordner haben wie mein Testprogramm und meine makefile? Oder macht es Sinn, im makefile den Pfad anzugeben? SO, dann kläre ich jetzt mal, wie das allgemeine im makefile funktioniert, gerade das $-Zeichen und die ganzen anderen Kürzel. Ich bin mir im Moment etwas unklar darüber, ob die Makefiles vom Prof dabei sind, um erweitert zu werden oder um benutzt zu werden.... Danke erstmal für eure Hilfe!
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo und herzlichen Glückwunsch zum ersten Erfolg! Um die header einzubinden gibt es mehrere Möglichkeiten. Zum einen gibt es Standard-Pfade (wie /usr/include/), in denen automatisch gesucht wird. Dazu kann/muss man natürlich die Pfade zu eigenen headern ergänzen. Dann gibt es noch den Unterschied zwischen relativen Pfaden und absoluten Pfaden. Beispiel:
| //header liegt im Projektverzeichnis unter PROJEKT/header, die andere Datei unter PROJEKT/lala
#include "../header/meinHeader.h" //ein Verzeichnis nach oben, dann in header wechseln (relativ zum Verzeichnisbaum)
//absolut wäre sowas wie
#include "/home/meinName/meinHeaderverzeichnis/meineHeaderDatei.h" //absolut zum Verzeichnisbaum
|
Ebenfalls wichtig in dem Zusammenhang sind Präprozessor-Anweisungen, die einem z.B. ermöglichen das mehrfache Einbinden der header zu verhindern. Beispiel:
#ifndef //if not defined: Sollte die Headerdatei schonmal eingebunden worden sein, so würde alles bis zum #endif übersprungen.
#define MEIN_HEADER
int KONS_TANTE = 12345;
double ZAHL = 3.456789;
#endif So. Die makefile-Geschichte vergessen ☺ Eine Möglichkeit wäre, den include-Pfad im makefile anzugeben. Da muss man dann aber bei den deps aufpassen, dass diese richtig gefunden werden können. Beispiel:
INC_DIR = ../meineHeader
...
DEPS = $(INC_DIR)/meineHeaderDatei.h
|
Milupinchen
(Themenstarter)
Anmeldungsdatum: 28. März 2016
Beiträge: 7
|
Aaaah, so langsam werde es Licht 😀 Ich möchte doch mal das makefile zeigen, das vom Prof kommt. BASE = ../..
NAME = lib$(shell basename `pwd`)
OUTPUT := $(BASE)/lib/$(NAME).so
GL = 1
PHYSX = 1
ODE = 1
DEPEND = Core Algo Gui extern_SWIFT
CXXFLAGS += -Wno-unknown-pragmas
SRCS = $(shell find . -maxdepth 1 -name '*.cpp')
OBJS = $(SRCS:%.cpp=%.o)
include$(BASE)/gofMake/generik.mk Jede Zeile ist mir noch nicht ganz klar, zb gerade die erste Zeile. BASE ist was genau? Also was drückt ../.. aus? Einfach als Hinweis auf das Verzeichnis, welches auf dem PC ist? Oder ist das zwei Etagen über dem Verzeichnis, in dem diese makefile liegt? Es kam ja in einem zu installierendem Paket vom Prof. Auch ist mir nicht ganz klar, ob die Variablen im zweiten Block übliche Variablen sind (da gehe ich jetzt aber auch gezielt googlen) und was die Zeile SRCS = .... macht. Aber die letzte Zeile ist klar, denn das ist ja auch das, was du beschrieben hattest. Die makefile hab ich mir mittlerweile auch angeschaut. Bevor ich aber wieder was teste, möchte ich gern diese makefile verstehen. Weil ich hab es im Ansatz echt verstanden, aber noch nicht so ganz. Aber ich glaube, und da darf man mich gerne korrigieren, falls ich mich irre, dass ich nur eine eigene Datei in den Projektordner packen muss, um die Header zu nutzen, und dann die makefile entweder ergänzen müsste, um meine Datei mit zu kompilieren oder die makefile einfach zum kompilieren nutze?
|
Milupinchen
(Themenstarter)
Anmeldungsdatum: 28. März 2016
Beiträge: 7
|
Und gerade bin ich einer spontanen Eingebung gefolgt und siehe da, ich kann nun erstmal die einzelnen Programme vom Prof mir ausgeben lassen ☺ makefile und shell sind schon was Feines *g* Das erleichtert mich sehr. Dann kann ich nämlich die verwendeten Methoden mal in Ausführung sehen, um auch darüber zu verstehen, was die Methoden tun....
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Milupinchen schrieb: Aaaah, so langsam werde es Licht 😀 Ich möchte doch mal das makefile zeigen, das vom Prof kommt. BASE = ../..
<
../ geht ein Verzeichnis hoch. Also von /home/milu/pinchen nach /home/milu.
NAME = lib$(shell basename pwd )
Spiele mal mit basename pwd herum. pwd gibt das aktuelle Verzeichnis als absoluten Pfad aus. basename reduziert das Ganze dann auf den letzten Ordner. Beispiel:
koffeinfriedhof@x220:~$ cd Sammelmappe/Medien/Musik/H/Hörbücher/
koffeinfriedhof@x220:~/Sammelmappe/Medien/Musik/H/Hörbücher$ basename $(pwd)
Hörbücher
koffeinfriedhof@x220:~/Sammelmappe/Medien/Musik/H/Hörbücher$ pwd
/home/koffeinfriedhof/Sammelmappe/Medien/Musik/H/Hörbücher OUTPUT := $(BASE)/lib/$(NAME).so
wäre somit ../../lib/Hörbücher.so (was keinen Sinn macht, aber ich war grad in dem Ordner ☺ )
SRCS = $(shell find . -maxdepth 1 -name '*.cpp')
sucht ab dem aktuellen Verzeichnis alle Dateien, die mit .cpp enden. Siehe auch find OBJS = $(SRCS:%.cpp=%.o)
ersetzt den gefundenen Dateinamen.cpp durch Dateinamen.o
|