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
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
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
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.
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
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
Sieht so aus, als ob da die Pfadangaben im Makefile durcheinandergekommen wären. Ich probier das jetzt mal aus
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.
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.
Super, vielen Dank für den Tipp, das probiere ich morgen direkt mal aus. Jetzt gehts erst mal ins Bett -) Gruß Ingo
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.