Hallo allerseits, so, jetzt brauch ich mal die Experten, da ich mit Linux (mint 17.2 ) noch nicht so ganz sicher bin. Ich habe ein Mikrocontrollerprojekt unter Linux mit dem im Linux installierten avr-gcc zu "bearbeiten". Das Projekt wurde unter Windows mit WinAVR ( und dem "make" für Windows ) fehlerlos zusammengebimst. Mit dem im Linux on Borad befindlichen make kommt es zu einer Fehlermeldung bei jeder Funktion, die in einem anderen jedoch eingebundenen Programm-Modul liegt. Das sieht so aus: objects/main.o: In Funktion `main': /home/joeder-ite/sw_01_lht/main.c:42: Nicht definierter Verweis auf `Init_System' objects/main.o: In Funktion `StateMachine': /home/joeder-ite/sw_01_lht/main.c:73: Nicht definierter Verweis auf `Switch_LEDs' ... ... u.s.w. Das muss ein Problem mit dem Linux-Make sein. Was meinen denn die Experten dazu ? In dem Steuerungsabschnitt für den Linker im makefile steht nur Folgendes: #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) #LDFLAGS += -T linker_script.x So, wer ist hier der King, wer kann helfen ? Grußli
Achim S. schrieb: > Was meinen denn die Experten dazu ? das dem linker ein Objekt fehlt. Poste mal die Kompletten ausgaben (vorher clean machen). In welcher Datei gibt es denn die Funktion "Switch_LEDs"? Und stell das System mal auf Englisch um "nicht definierter Verweis" und "schlechtes Pointer" sind furchtbar.
Ist der Kram geheim ? Wenn nicht: hochladen, dann sieht man was Sache ist
Achim S. schrieb: > Ja, der "Kram" ist vertraulich. Na dann wende dich an die make-Doku oder den King deines Vertrauens ;-)
Hallo, jau, und wie stelle ich auf Englisch um ? Und vor allem wen ? Den compiler ? Den Linker ? Make ? Ich habe mal ein Beispielprojekt gemacht. Dort tritt das selbe Problem auf. Make spricht folgendes: Compiling C: main.c avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=8000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=obj/main.lst -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o obj/main.o Linking: main.elf avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=8000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=obj/main.o -std=gnu99 -MMD -MP -MF .dep/main.elf.d obj/main.o --output main.elf -Wl,-Map=main.map,--cref -lm obj/main.o: In Funktion `main': /home/joeder-ite/sw_devlpmnt_01/main.c:9: Nicht definierter Verweis auf `Init_ATmega16_for_RFM02_Module' /home/joeder-ite/sw_devlpmnt_01/main.c:11: Nicht definierter Verweis auf `function_xyz' collect2: error: ld returned 1 exit status make: *** [main.elf] Fehler 1 Und nu ?
Achim S. schrieb: > jau, und wie stelle ich auf Englisch um ? Und vor allem wen ? alle export LANG=C makefile: # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c ich finde nirgends das du module_02.c kompilierst.
Jau, ich hab's ! In der Tat, dem Linker fehlen die Object-Files der weiteren Module. Dann ist aber das make-template von WinAVR nicht so ganz richtig: # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c DAS reicht wohl nicht ! Und dass die "C dependencies automatically generated" werden, stimmt wohl auch nicht so ganz ... Bei den weiteren Modulen ( _01, _02 ) muss übrigens die "includes.h" includiert werden, sorry mein Fehler, Schande über mein Haupt ... Dann geht's ja doch ! Na gut, trotzdem dankeschön und bis zum nächsten mal :-o
Achim S. schrieb: > # List C source files here. Hm. Was wollen uns diese Worte sagen? List Du sollst etwas auflisten... C source files Was soll aufgelistet werden? C-Source files... here Wo sollen die aufgelistet werden? Nicht irgendwo, sondern hier... Und kaum macht man's richtig, schon funktioniert's. Unter Linux genauso wie unter Windows. Da gibt's keinen UNterschied. Die dependencies, die automatisch erzeugt werden, beziehen sich auf die Header files. Das makefile, daß automatisch und selbständig erahnen kann, welche source-files zu einem Projekt gehören, muß erst noch erfunden werden. Oliver
Ja, ja, so ist das manchmal ... da sieht man vor lauter Bäumen den Wald nicht mehr ... Aber da Du Dich ja offenbar mit makefiles gut auskennst ... Ich würde gerne die entstehenden Output-Files wie main.elf etc. in ein separates Verzeichnis ausgeben lassen. Mit den Object-Files ist mir das ja mit der Anweisung OBJDIR= obj gelungen. Wie mach ich denn das mit den sonstigen Files ? Und woher könnte ich diese Info kriegen, wenn jetzt nicht hier ? Also unter make --help krieg ich darüber auf jeden Fall nix ... Gruß
Achim S. schrieb: > Und woher könnte ich diese Info kriegen, wenn jetzt nicht hier ? im Internet? http://www.gnu.org/software/make/ http://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html#Makefile-Conventions
Achim S. schrieb: > Ich würde gerne die entstehenden Output-Files wie main.elf etc. in ein > separates Verzeichnis ausgeben lassen. ... > Und woher könnte ich diese Info kriegen, wenn jetzt nicht hier ? > > Also unter make --help krieg ich darüber auf jeden Fall nix ... Logisch. Dem make ist das ja auch völlig wurscht. make macht nur eines: es vergleicht die Datümer von Dateien und wenn die abhängige Datei älter ist als eine Datei von der es abhängt, dann wirft es ein Kommando an. Was dieses Kommando dann macht, das interessiert make nicht mehr. wenn du also deine ELF Dateien in ein Verzeichnis verschoben haben willst, dann musst du dem Kommando (= Dem Programm) welches die ELF Files erzeugt mitteilen, wo es die gefälligst hinzuspielen hat. Oder aber du hängst noch ein Kommando hinten drann, welches die entstandene Datei entsprechend kopiert oder verschiebt. Dem make ist das hingegen völlig schnurzegel. D.h. du suchst an der völlig falschen Stelle nach einer Lösung für dein 'Problem'. Du musst unterscheiden zwischen den Werkzeugen, die dein Projekt bearbeiten und dann letzten Endes im fertigen Endprodukt münden und der Verwaltung, die den Einsatz dieser Werkzeuge koordiniert. make ist nur für die Koordination zuständig und das das richtige Werkzeug zum richtigen Zeitpunkt mit den richtigen Parametern zum Einsatz kommt. Wenn du also enstehende Dateien irgendwo hinverschoben haben willst, dann musst du dir ansehen: welches Werkzeug erzeugt eigentlich die Datei? Wie kann ich diesem Werkzeug ein bestimmtes Verhalten aufzwingen (Command line parameter)? Und von welcher Stelle aus in meinem makefile aus wird dieses Werkzeug aufgerufen und wo muss ich daher weitere Command Line Parameter für dieses Werkzeug angeben, damit dieses Teil genau das tut, was ich will.
:
Bearbeitet durch User
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.