Forum
Tipps
News
Menu-Icon

Suse: Linux C++ - Ich verstehe die Anleitungen zu Makefile nicht

Hi :)

ich fange gerade mit C/ C++ und Assembler unter Linux an und konnte bisher kein Makefile für folgende Gegebenheit erstellen:

Der Quelltext '/home/r66/Desktop/versuch.cpp' benötigt neben 'iostream.h' auch noch '/usr/lib/qt3/include/qapplication.h' und '/usr/lib/qt3/include/qmainwindow.h', wenn auch nicht in der hier abgebildeten, gekürzten Variante.

Die Dateien 'versuch.cpp', 'qapplication.h' und 'qmainwindow.h' existieren in den angegebenen Pfaden.

Kommentiere ich die Qt's aus, funktioniert alles:

1 // versuch.cpp
2
3 #include <iostream>
4 //#include <qapplication.h>
5 //#include <qmainwindow.h>
6 using namespace std;
7
8 int main(int argc, char **argv)
9 {
10   cout << " versuch\n";
11   return 0;
12 }
13

1 # Makefile
2
3 versuch : versuch.cpp
4    g++ versuch.cpp -o versuch

1 # Makefile
2
3 versuch : versuch.o
4    g++ versuch.o -o versuch
5
6 versuch.o : versuch.cpp
7    g++ -c versuch.cpp -o versuch.o

Die richtigen Zeilen um 'qapplication.h' und 'qmainwindow.h' mit einzubeziehen bekomme ich auch mit tmake nicht hin.

Grüße

Ralf


Antworten zu Suse: Linux C++ - Ich verstehe die Anleitungen zu Makefile nicht:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Du musst den Pfad zu den Qt-Dateien natuerlich beim Bauen mit angeben:

# Makefile

versuch : versuch.o
    g++ versuch.o -o versuch

versuch.o : versuch.cpp
    g++ -c versuch.cpp -I/usr/lib/qt3/include -o versuch.o
Oder so aehnlich, weiss jetzt grad nicht genau 

Hi Lisaa :)

danke, ich habe zu spät gemerkt, das es eine passendere Rubrik für mein Anliegen gibt, daher bin ich auch dort auf Deine Anregung eingegangen, die mir leider nicht neu war, s. http://www.computerhilfen.de/hilfen--187134-0.html#918908.

Grüße

Ralf

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hallo Kasper.ger,

damit das Ganze überhaupt klappt, musst Du zuerst jede Menge -devel Pakete nachinstallieren ( Siehe auch den Workshop in Tipps und Tricks in der orangen Leiste ). Damit der Kram auch für's Kompilieren gefunden wird, müssen die Umgebungsvariablen QTDIR und QMAKESPEC erfolgreich gesetzt sein.

export QTDIR=/usr/lib/qt3/
export QMAKESPEC=/usr/lib/qt3/mkspecs/linux-g++/

Have Fun

Danke :)

zuerstmal @ Dr. SuSE, meinst Du diese orange Liste? Dort habe ich dann scheinbar alles zum Thema übersehen.

Ich habe schon verschiedenes probiert unter anderem auch

TMAKE_DIR=/opt/tmake
TMAKEPATH=${TMAKE_DIR}/lib/linux-g++
PATH=$PATH:${TMAKE_DIR}/bin
QTDIR=/usr/lib/qt"VERSION"
KDEDIR=/opt/kde"VERSION"
export TMAKEPATH PATH QTDIR KDEDIR

und die Optionen -L und -I angegeben

/usr/lib/qt3/bin, etc. und
/usr/lib/qt3/include/

allerdings rückblickend für mich nicht mehr überschaubar, in welcher Kombination meiner vielen Versuche, bezüglich des KDE habe ich glaube ich auch nie die richtige Version angegeben, das werde ich heute oder morgen nochmal mit den neuen Erkenntnissen ausprobieren.

Wenn ich dem Compiler beim Aufruf statt "$(QTDIR)/include" direkt "/usr/lib/qt3/include" angebe reicht das nicht?

Das bei mir noch Devel fehlen kann sein, doch ./configure, make, checkinstall oder zeitaufwendiges compilieren mit SCons musste ich auch ohne selbst zu programmieren öfter machen, fehlt etwas wird es ja auch entsprechend ausgegeben, zu derartigen Fehlermeldungen kam es bisher im Rahmen der Makefile-Problematik noch nicht.

Kann ich die Umgebungsvariablen in /etc/profile meines Suse' fest eintragen oder spricht etwas dagegen?

Soeben habe ich gelesen, das xwpe, ein integriertes Envoiroment, das ich nicht installiert habe, einen Menü-Punkt haben soll, Options -> Compiler -> C, indem man Compiler- und Loader-Options eintragen kann, so etwas hat Anjuta ebenfalls und wahrscheinlich auch KDevelop, habe ich aber scheinbar noch nicht richtig benutzt.

Ich werde das mit dem Makefile nochmal ganz neu an gehen und ggf. dann konkretere Fragen stellen können.

Vorab aber schon mal, wenn quelltext.cpp abhängig von qdings.h und qda.h währe, dann müsste dies doch, die Pfade -L und -I, sowie Flags wie -Wall außer Acht gelassen, wie folgt dargestellt werden oder?

# Makefile

quelltext : quelltext.o
    g++ quelltext.o -o quelltext

quelltext.o : quelltext.cpp qdings.h qda.h
    g++ -c quelltext.cpp -o quelltext.o

Das Programm quelltext ist an die aktuellste Datei quelltext.o gebunden?
quelltext.o ist an den aktuellsten Quelltext quelltext.cpp inkl. der gleich bleibenden Includes qdings.h und qda.h gebunden?
Weitere Abhänigkeiten und dazu gehörige Aktionen müsste ich nur definieren, wenn auch qdings.h und qda.h verändert werden könnten?
Solange in den Includes wiederum nicht zu verändernde Includes sind, muss ich für diese keine Regeln erstellen, resp. eben schon die hier außer Acht gelassenen, übergeordneten Pfade angeben, hier z.B. in Form von QTDIR?

Würde ich statt Qt, FLTK nutzen, wie rufe ich ab, ob die Variable FLTKDIR nicht z.B. schon von einer anderen Anwendung, für etwas anderes in Beschlag genommen wurde oder ob nicht QTDIR von einer Anwendung als Pfad zu /qt4, statt /qt3 eingesetzt werden muss?

Kann man zum Compilieren eines C++-Quelltextes anweisen in den Quelltext eingebundenen Assembler nach bestimmten Regeln zu interpretieren, also ob es 'mov zu von' oder als 'mov von zu' interpretiert werden soll?

Könnte ein nicht über rpm in /usr installiertes Programm von einem gleichnamigen Programm durch rpm -i überschrieben werden, ohne das man drauf hingewiesen würde?

Grüße

Ralf

1. Versuch

Nachdem ich xwpe compiliert und mit rpm eingebunden und über Options -> Compiler -> C++ und Project -> Open Project -> Options Angaben zu g++ -I und -L machte, blieben noch zu viele Fragen offen, um hier weiter ansetzen zu können, in dieser Reihenfolge nutzte mir tmake nichts, mit kdevelop kam ich gar nicht klar und anjuta konnte mir wie tmake nicht weiter helfen, also wieder zurück zur Handarbeit.

2. Versuch - Manuelles erstellen von Makefile

# Makefile frei nach
# Linux Programmierung / N. Matthew, R. Stones, 1. Auflage 2000, S. 304
#
#    myapp: main.o 2.o 3.o
#        gcc -o myapp main.o 2.o 3.o
#
#    main.o: main.c a.h
#        gcc -c main.c
#
#    2.o: 2.c a.h b.h
#        gcc -c 2.c
#
#    3.o: 3.c b.h c.h
#        gcc -c 3.c

versuch_1: versuch_1.o
    g++ -I/usr/lib/qt3/include -L/usr/lib/qt3/lib -L/usr/lib -L/usr/X11R6/lib -lm -llcgi -lqt - lXext -lX11 -o versuch_1 versuch_1.o

versuch_1.o: versuch_1.cpp qapplication.h qmainwindow.h
    g++ -I/usr/lib/qt3/include -L/usr/lib/qt3/lib -L/usr/lib -L/usr/X11R6/lib -lm -llcgi -lqt - lXext -lX11 -c versuch_1.cpp

ergibt den Fehler

r66@linux:~/Projects/xwpe/versuch_1> make
make: *** Keine Regel vorhanden, um das Target »qapplication.h«,
  benötigt von »versuch_1.o«, zu erstellen.  Schluss.

also das qapplication.h nicht vorhanden sei, wenn ich dem bereits zitierten Buch glauben kann.

Sollte man Variablen definieren müssen, welche? <- PS: Dem Buch nach muss man keine Makros verwenden, die Infos beziehen sich nur auf g++ und müssen somit nicht außerhalb des Makefiles bekannt gemacht werden, wenn ich das richtig verstehen sollte.
« Letzte Änderung: 16.08.07, 18:34:03 von KAsper.ger »

Huhu Dr. Suse :)

r66@linux:~/Projects/xwpe/versuch_1> ls
Makefile  versuch_1.cpp

r66@linux:~/Projects/xwpe/versuch_1> export QTDIR=/usr/lib/qt3/
r66@linux:~/Projects/xwpe/versuch_1> export QMAKESPEC=/usr/lib/qt3/mkspecs/linux-g++/
r66@linux:~/Projects/xwpe/versuch_1> make
make: *** Keine Regel vorhanden, um das Target »qapplication.h«,
  benötigt von »versuch_1.o«, zu erstellen.  Schluss.

r66@linux:~/Projects/xwpe/versuch_1> export QTDIR=$QTDIR:/usr/lib/qt3/
r66@linux:~/Projects/xwpe/versuch_1> export QMAKESPEC=$QMAKESPEC:/usr/lib/qt3/mkspecs/linux-g++/
r66@linux:~/Projects/xwpe/versuch_1> make
make: *** Keine Regel vorhanden, um das Target »qapplication.h«,
  benötigt von »versuch_1.o«, zu erstellen.  Schluss.
r66@linux:~/Projects/xwpe/versuch_1>

Was mache ich falsch?

Gruß

Ralf

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Du musst natürlich auch sagen, wo denn qapplication.h etc. liegen, wenn nicht in ./

# Makefile...

QT_INCLUDE_DIR = /usr/lib/qt3/include

versuch_1: versuch_1.o
    g++ -I/usr/lib/qt3/include -L/usr/lib/qt3/lib -L/usr/lib -L/usr/X11R6/lib -lm -llcgi -lqt - lXext -lX11 -o versuch_1 versuch_1.o

versuch_1.o: versuch_1.cpp $(QT_INCLUDE_DIR)/qapplication.h $(QT_INCLUDE_DIR)/qmainwindow.h
    g++ -I/usr/lib/qt3/include -L/usr/lib/qt3/lib -L/usr/lib -L/usr/X11R6/lib -lm -llcgi -lqt - lXext -lX11 -c versuch_1.cpp

Allerdings ist es eher unüblich, sämtliche Bibliotheks-Includes bei den dependencies mit anzugeben, da wird dann an anderer Stelle (z.B. beim configure etc.) sichergestellt, dass die Bibliothek korrekt installiert ist und kann dann davon ausgehen, dass die benötigten Header auch da sind.
« Letzte Änderung: 16.08.07, 20:18:46 von Lisaa »

Danke Lisaa :)

sehr gut!

r66@linux:~/Projects/xwpe/versuch_1> make -f makefile_lisaa
g++ -I/usr/lib/qt3/include -L/usr/lib/qt3/lib -L/usr/lib -L/usr/X11R6/lib -lm -llcgi -lqt -lXext -lX11 -c versuch_1.cpp
g++: -lm: linker input file unused because linking not done
g++: -llcgi: linker input file unused because linking not done
g++: -lqt: linker input file unused because linking not done
g++: -lXext: linker input file unused because linking not done
g++: -lX11: linker input file unused because linking not done
g++ -I/usr/lib/qt3/include -L/usr/lib/qt3/lib -L/usr/lib -L/usr/X11R6/lib -lm -llcgi -lqt - lXext -lX11 -o versuch_1 versuch_1.o
g++: lXext: Datei oder Verzeichnis nicht gefunden
g++: -E or -x required when input is from standard input
make: *** [versuch_1] Fehler 1

Muss jetzt noch einkaufen und kann nicht weiter testen, doch das scheint der richtige Weg zu sein :).

Es währe natürlich interessant, wie das ganze Fachgerecht aussehen würde.

Gruß

Ralf

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hallo,

Lisaa hat es schon recht treffend ausgedrückt mit diesen Worten:

Zitat
Allerdings ist es eher unüblich, sämtliche Bibliotheks-Includes bei den dependencies mit anzugeben,

Drum hab ich dir gestern aufgeschrieben welche Variablen zu setzen sind, damit die Sachen gefunden werden. Was mir hier nicht klar ist, was das geben soll. Sind das erste C++ Eigenversuche oder ist es ein Auszug aus einem ferigen Quellcode, den Du übersetzen willst?

Werde hier keinen Programmierkurs starten, weil Einsteigerforum, aber wenn ich erkennen kann worum es genau geht, kann dabei auch schon mal ein zielgerichteter Tipp rüberkommen.

Have Fun

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ein "Standard-Makefile" könnte etwa so aussehen, Optionen und Includeverzeichnisse nach Bedarf hinzufügen.

CC=g++

QT_DIR         = /usr/lib/qt3
QT_INCLUDE_DIR = $(QT_DIR)/include
QT_LIB_DIR     = $(QT_DIR)/lib

# put required libraries here, e.g. $(QT_LIB_DIR)/some_lib.a
LIBS           =
# put complier options here
CFLAGS         = -c -Wall -I$(QT_INCLUDE_DIR)
# put linker options here
LDFLAGS        = -Wall

SOURCES        = versuch_1.cpp
HEADER         = $(QT_INCLUDE_DIR)/qapplication.h $(QT_INCLUDE_DIR)/qmainwindow.h
OBJECTS        = $(SOURCES:.cpp=.o)
EXECUTABLE     = versuch_1

all: $(SOURCES) $(HEADER) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) -o $@ $(OBJECTS) $(LIBS)

.cpp.o:
$(CC) $(CFLAGS) $< -o $@

 

EDIT: Wenn du planst, weiter Qt zu verwenden, könntest du auch einen Blick auf qmake werfen:
http://doc.trolltech.com/4.3/qmake-manual.html
Weiß jetzt gerade nicht, was da die Unterschiede zu tmake sind (falls es welche gibt), aber das sieht gar nicht so schwer aus.
   
« Letzte Änderung: 16.08.07, 22:02:09 von Lisaa »

Danke Lisaa :) und Dr. Suse :)

Irgendwas-C habe ich mal mit dem 286-Hardware-Emulator meines Atari ST progammiert, doch ansonsten habe ich Musiksoftware in Assembler, nicht für inteloide geschrieben, das heißt ich bin ein absoluter Anfänger auf dem Linux-PC, Wissen über Computer und Musik-Normen wie MIDI habe ich, das heißt, es gibt noch kein Programm, aber schon eine Vorstellung, etwas das ich früher bereits mal programmiert habe.

Ich will C++ lernen, um mit Linux klar zu kommen, Dokumentationen verstehen zu können, denn Linux bereitet mir nur Scherereien und ich will wissen warum, abgesehen davon, das mein Computer für gehobene Anwendungen zusammen mit Linux völlig untauglich ist, daher ...

habe ich mich für Qt und FLTK entschieden, beide könnte ich auch für Windows crosscompilieren, naja, z.Z. kann ich es wahrscheinlich nicht ;), um eine weitere Frage zu beantworten, ich will nicht ausschließlich bei Qt bleiben.

So ein Blanko-Makefile habe ich gesucht und bisher nicht gefunden, die Bücher- und Internet-Beispiele geben das nicht her und das betrachten von vorhandenen Makefiles kann erheblich verwirren, resp. muss man erstmal welche finden, oft sind es welche, die scheinbar irgendwie in mehrere gesplittet zu sein scheinen.

Ich würde am liebsten sofort weiter machen, doch dann müsste ich verhungern, jedenfalls habe ich über E-Mail einen Haudegen von früher erreichen können, der heute immer noch in dem Bereich Programmierung aktiv ist, beruflich allerdings auch nicht mit C++, doch wahrscheinlich wird auch er mir noch weiter helfen können, denn auch wenn sich das Makefile jetzt aufgeklärt haben sollte, es gibt bei mir noch immer Unklarheit darüber, was ich so an -lm, /X11R6 etc. benötige.

Ärgerlich an Computerhilfen ist, das es zwar eine Rubrik für Programmierung gibt, diese aber nicht speziell auch für Linux, ich würde also vorzugsweise glaube ich auch in Zukunft Fragen lieber an die Linux-Abteilung richten, denn angenehm an Computerhilfen-Linux ist der Umgangston, der in Linux-Foren in der Regel sehr dogmatisch, bis völlig irre ist, hier aber eher selten ein solches Gesicht zeigt.

Nochmal Danke und vielleicht schon bis morgen, mein Futter ruft

Ralf

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hallo,

okay, ich misch mal ein wenig mit. Eine Ergänzung zum gestrigen Post.

Zuerst sollte man sich darum kümmern,nachdem man seine Entwicklungsumgebung istallert hat, dass die Pfadvariablen richtig gesetzt sind. Das kann beispielsweise dauerhaft in /etc/profile.d/qt3.sh geschehen ( SuSE ). Eine steht da schon drin, damit die QT Programme ihre Umgebung finden.

Ein Beispiel der zu setzenden Umgebungsvariablen:

TMAKE_DIR=/opt/kde3/bin/tmake

TMAKEPATH=${TMAKE_DIR}/lib/linux-g++
PATH=$PATH:${TMAKE_DIR}/bin
QTDIR=/usr/lib/qt3
KDEDIR=/opt/kde3

export TMAKEPATH PATH QTDIR KDEDIR

Wo tmake sich befindet kommt darauf an wie man es installiert hat. !!Pfad ggf. anpassen!!

Soweit erstmal dazu.

Wer vorzugsweise nur unter GNU/Linux bzw. UNIX programmiert, sollte sich sehr schnell ernsthaft überlegen, ob er nicht gleich das Gespann autconf/automake einsetzt, anstatt tmake zu verwenden. Gerade für umfangreichere Programme und wenn der Quelltext auch auf verschiedenen Installationsvarianten kompilierbar sein soll, ist es unabdingbar, autoconf/automake zu verwenden. Wer früher oder später daran denkt, auch das eine oder andere KDE-Programm zu schreiben, wird um autoconf/automake erst recht nicht herumkommen. KDE Entwickler akzeptieren keinen Code im CVS, der diese Bedingung nicht erfüllt.

Have Fun

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hallo ,

denke ich decke hier ein weites Themenspektrum ab um dem Ein/Umsteiger in Sachen Linux das Leben zu erleichtern. Hier nun auch noch mit einer Programmiersparte zu beginnen sprengt den Rahmen des Linuxforums wie ich es angelegt habe und auch meine knappe Zeit.

Würde es Dir reichen wenn ich Dir hilfreiche Links zum Thema hier hineinstelle ??

Hast Du dich schon auf eine Entwicklungsumgebung festgelegt? Persönlich benutze ich Kdevelop und auch Eclipse. Hier kann ich dir am  Meisten  den einen oder anderen Tipp geben.

Lass es mich wissen, werde sehen was sich machen lässt.

Beste Grüsse

Dr. SuSE

linux:/home/r66 # smart install autoconf automake
Lade Zwischenspeicher...
Update Zwischenspeicher...                  ########################################################### [100%]

WARNUNG!: autoconf-2.60-21@i586 ist bereits installiert
WARNUNG!: automake-1.9.6-35@i586 ist bereits installiert
Berechne Vorgang ...

Wider meines Wissens habe ich diese bereits :D.

« Suse: VIDEO-SPOTS auf Internet-Seiten von ZDF, N3, u.s. w. ansehenSuse: WINE LEGT VERZEICHNISSE IN ROOT ORDNER »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
C++
C++ ist eine von der ISO standardisierte Programmiersprache und eine erweiterte Form von C zur objektorientierten, generischen und prozeduralen Programmierung. Weitestgeh...

Linux
Linux bezeichnet ein kostenloses Betriebssystem, das als Open Source verfügbar ist. Die erste Version entstand 1991 und wurde von dem Finnen Linus Torvalds aus dem S...

Dateiendungen
Die Dateiendung, auch Dateinamenerweiterung, Dateierweiterung oder einfach "Endung" genannt, besteht aus meistens drei oder vier Buchstaben und wird mit einem Punkt an de...