Forum: Compiler & IDEs gcc Makefile


von Christian S. (vivus)


Lesenswert?

Hallo,

ich habe zwei unterschiedliche Projekte:

1. Projekt: Hier nutze ich can4linux und mysql mit folgendem Makefile 
(TARGET=LINUX_X86): http://db.vivus.org/Makefile

2. Projekt: Hier nutze ich MQTT und kompiliere über die Konsole:
1
#gcc stdoutsub.c -I src -I src/linux -I MQTTPacket/src MQTTClient.c src/linux/MQTTLinux.c MQTTPacket/src/MQTTFormat.c  MQTTPacket/src/MQTTPacket.c MQTTPacket/src/MQTTDeserializePublish.c MQTTPacket/src/MQTTConnectClient.c MQTTPacket/src/MQTTSubscribeClient.c MQTTPacket/src/MQTTSerializePublish.c -o stdoutsub MQTTPacket/src/MQTTConnectServer.c MQTTPacket/src/MQTTSubscribeServer.c MQTTPacket/src/MQTTUnsubscribeServer.c MQTTPacket/src/MQTTUnsubscribeClient.c

Nun würde ich gerne beide Projekte zusammenführen sprich can4linxu, 
mysql und MQTT in einem Projekt nutzen.

Mein Problem ist, wie bekomme ich den Konsolenbefehl ins Makefile (Ich 
habe es hier: http://db.vivus.org/Makefile2 mal versucht, bekomme aber 
nicht alles unter)

Welche Files er genau kompilieren soll ist klar. Auch wo die -I Paramter 
hinkommen. Sprich -I src -I src/linux -I MQTTPacket/src aber wo muss der 
Rest hin? (also die Pfade mit Datei dh: MQTTClient.c 
src/linux/MQTTLinux.c MQTTPacket/src/MQTTFormat.c 
MQTTPacket/src/MQTTPacket.c MQTTPacket/src/MQTTDeserializePublish.c 
MQTTPacket/src/MQTTConnectClient.c MQTTPacket/src/MQTTSubscribeClient.c 
MQTTPacket/src/MQTTSerializePublish.c) Laut dem Manual von GCC darf 
hinter -I nur ein Ornder... (Hier der Versuch: 
http://db.vivus.org/Makefile2)

Und dann noch der hintere Teil, welchen ich überhaupt nicht unter 
bekomme:
-o stdoutsub MQTTPacket/src/MQTTConnectServer.c 
MQTTPacket/src/MQTTSubscribeServer.c 
MQTTPacket/src/MQTTUnsubscribeServer.c 
MQTTPacket/src/MQTTUnsubscribeClient.c

Wo genau müssen Pfade zu C-Files in dieses Makefile?

(Bitte beachtet, dass ich zwei Makefiles gepostet habe: Makefile und 
Makefile2)

Würde mich freuen, wenn mir jemand beim zusammenführen des Makefiles und 
dem Konsolenbefehl behilflich sein könnte.

von I <3 Makefiles (Gast)


Lesenswert?

"divide et impera" - teile und herrsche

Besser als alles in eins zu wurschteln, betrachte die bisherigen 
Projekte als Subsysteme des neuen Gesamtprojektes.

Setze also Quell- u. Objektfilelisten, Pfadlisten (-I), Verzeichnisse 
(Quell-, Libs-, Objekt-), Kompiler- u. Linkoptionen usw. separat fuer 
die verschiedenen Buildabschnitte - z.B. in Abschnittspezifische 
Variablen.
Erst in den jeweiligen Abschnitte weist Du die fuer diesen Abschnitt 
gültigen Variablen den Standard-Makevariablen.
Ev. passt Du die einzelnen Wekzeugaufrufe welche als generische 
Variablen (z.B. CC, LD, usw.) vorliegen halt deinem allg.gültigen Muster 
an (also mit zus. Platzhaltervariablen welche Deinen Bedürfnisse 
dienen).

Achtung: rekursive Aufrufe von make (z.B. Aus einem übergeordneten 
Makefile) gehen, birgt aber spezifische Probleme.
Eines davon ist dass die erste aufgerufene make-Instanz nicht alle 
Abhängikeiten bis in die Tiefe "zu Gesicht" bekommt, sodass es seine 
Hauptaufgabe "Abhängigkeiten auflösen" nicht erfüllen kann. Negative 
Auswirkung davon sind auch Änderungen nicht mitbekommen und nicht 
passend (genug) nachkompilieren/linken UND nicht parallelisieren können 
(make option "-j"). Bei stundenlangen Builds IST dies relevant, oder 
nicht alle Kerne die man hat bekommen soviel zu tun wie es möglich wäre.

Jetzt sind die unabhängigen Projekte noch richtig unabhängig 
voneinander (der Systemarchitekt sagt "lose gekoppelt").
Nur weil man sie in einem Projekt gemeinsam benutzt, heisst dies nicht 
dass diese lose Koppelung zu verwerfen ist und durch enge Koppelung 
alles in eine Presswurscht kommen muss.
Behalte also die Modularisierung und die internen Schnittstellen im 
neuen Gesamtprojekt im Auge: diese Aufteilung wiederspiegelt sich in der 
#include-Hierarchie und auch in der Makefilegestaltung.

Hilfreich dies zu bewerten, ist dazu Doxygen auf den Code loszulassen 
und Diagramme zur Importhierarchie generieren zu lassen: auf diesen 
Bilder erkennt man gut wenn von "Weither" ganz "Lowlevel" Includes 
geholt werden und sonstwie "Pfeile kreuz und quer" gehen.

von Christian S. (vivus)


Lesenswert?

Ich kann mir zwar vorstellen, was du meinst, habe aber überhaupt keine 
Ahnung wie ich das umsetzen könnte. Gibt es da nicht eine einfachere 
Variante? Es muss doch möglich sein, die konsolen Befehle in das 
Makefile einzufügen...?

von Christian S. (vivus)


Lesenswert?

Kann gelöscht werden, habs gelöst. Danke.

von Sheeva P. (sheevaplug)


Lesenswert?

Christian S. schrieb:
> Kann gelöscht werden, habs gelöst. Danke.

Wie?

von Christian S. (vivus)


Lesenswert?

Hab einfach alle Dateien in einen Ordner gelegt und über includes.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.