Forum: Compiler & IDEs Studio + WinAVR, 2 alternative LCD Treiber wie?


von Ingo S. (ingo-s)


Lesenswert?

Hi,

ich benutze in meinem Projekt 2 alternative LCD Treiber, die in 
getrennten Unterverzeichnisisen liegen, sie haben den gleichen 
Dateinamen (Lcd.c/h) und natürlich die gleichen extern Funktionsnamen.
Bei beiden Versionen ist der Inhalt mit cond. compiling gesteuert. Das 
funktioniert auch alles, die Auswahl erfolgt über die Project 
Configurations die dann ein entsprechendes define für die jeweilige 
Version enthält.

Das Problem ist aber, ich darf in den Project Einstellungen nicht die 
Files von beiden Versionen gleichzeitig hereinnehmen. Ich muss immer die 
Files der unbenutzten Version heraus nehmen.
Versuche das über die include directories zu steuern hat keinen Erfolg 
gebracht. Kann das Studio das eventuell nicht handeln oder habe ich da 
einen Fehler gemacht?

Gruß Ingo

von Marius W. (mw1987)


Lesenswert?

Wie wäre es, wenn du die Auswahl über nen Präprozessor-Switch machst und 
dann einfach ein
1
#ifndef USE_LCD1

nimmst.

MfG
Marius

von Ingo S. (ingo-s)


Lesenswert?

Hi Markus,
das habe ich ja mit "Inhalt mit cond. compiling gesteuert" gemeint und 
auch gemacht. Die Probleme treten erst beim Linker auf mit "multiple 
definition" auf. Der Linker nimmt wohl die object files von beiden 
Versionen.

Gruß Ingo

von !Gast (Gast)


Lesenswert?

Das klingt logisch, wenn du beide Dateien ins Projekt einbeziehst werden 
beide compiliert und der Linker versucht dann natürlich beide in der 
.hex-Datei unterzubringen. Das bläht letztere auf bzw. erzeugt 
Linkerfehler bei gleichen Namen.

Eine andere Lösung als "nur eine der beiden Versionen zum Projekt 
hinzufügen" sehe ich nicht. Vielleicht lässt sich die Kommandozeile vom 
Linkeraufruf beeinflussen, aber das ist was für die Profis.

von holger (Gast)


Lesenswert?

#ifdef USE_LCD1
 #undef USE_LCD2

von Oliver (Gast)


Lesenswert?

Ingo Stahl schrieb:
> das habe ich ja mit "Inhalt mit cond. compiling gesteuert" gemeint und
> auch gemacht. Die Probleme treten erst beim Linker auf mit "multiple
> definition" auf.

Was genau hast du denn gemacht?

Wenn du das beide C-Files jeweils komplett mit #ifdef XX/YY .. #endif 
umgibst, sieht der linker immer nur ein File, das andere ist jeweils 
"leer". Dann gibt es auch keine multiple definitions.

Oliver

von Ingo S. (ingo-s)


Lesenswert?

Hi Oliver,

ja beide sind mit #ifdef XX/YY .. #endif inclusiver der Header Files 
umgeben. Der Compiler versucht natürlich alles zu compilieren, da ist 
aber nichts drin. Wenn ich die object files im zugehörigen Output Pfad 
lösche bleiben die auch leer.
Wenn ich mir die Fehlermeldung ansehe, scheint es so auszusehen, als ob 
der Linker zweimal darüber geht. first definition und multiple 
definition zeigen auf die gleiche Stelle.

lcd.o: In function `lcd_command':
C:\Dev_AVR\winAVR\SetUp_Boxen\SensorRobbeBox\default/../LcdLib/lcd.c:358 
:  multiple definition of `lcd_command'
Lcd.o:C:\Dev_AVR\winAVR\SetUp_Boxen\SensorRobbeBox\default/../LcdLib/lcd 
.c:358:  first defined here
... und weitere

die Fehlermeldung kommt praktisch für alle als extern deklarierten 
Funktionen.

Gruß Ingo

von Karl H. (kbuchegg)


Lesenswert?

Sieht so aus, als ob da die Pfadangaben im Makefile 
durcheinandergekommen wären.

Ich probier das jetzt mal aus

von Karl H. (kbuchegg)


Lesenswert?

Also

Das klappt bei mir genauso, wie wir uns das vorgestellt haben.
Womit AVR-Studio überhaupt keine Freude hat, ist, wenn die *.c bzw *.h 
Files gleich heissen. Da kommt dann einiges im Makefile durcheinander.
ABer nachdem ich die Dateien auch Namensmässig sauber getrennt habe, 
wars kein Problem mehr. Ich kann mit einer Compiler Option in den 
Project Settings zwischen den Files/Funktionen hin und her schalten.

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Und hier mein Testprojekt dazu

Wenn ich den Dateien auf den Subverzeichnissen gleiche Namen gebe 
(lcd.c/lcd.h anstelle von lcd1.c/lcd1.h bzw lcd2.c/lcd2.h), dann gibts 
Ärger.

von Ingo S. (ingo-s)


Lesenswert?

Super,
vielen Dank für den Tipp, das probiere ich morgen direkt mal aus. Jetzt 
gehts erst mal ins Bett -)

Gruß Ingo

von Ingo S. (ingo-s)


Lesenswert?

Hallo Karl Heinz,

funktioniert einwandfrei!

Nochmals vielen Dank

Gruß Ingo

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.