Ich habe ein Problem bein kompilieren eines einfachen Testprograms mit arm-none-eabi-gcc Das ganze klappt einwandfrei solange ich nicht versuche Funktionen aus externen Libraries zu nutzen. Der include selbst wird nicht als Fehler gemeldet. http://lpaste.net/356983 Dort sieht man den kurzen Quellcode + Makefile + consolen output Das Problem tritt in Zeile 36 auf.
Wenn Du Funktionen aus Libraries verwenden willst, musst Du auch mit den Libraries linken. Die Arduino-Schöpfer haben ärgerlicherweise die idiotische Idee gehabt, Headerdateien (*.h) als "Library" zu bezeichnen, das ist falsch und irreführend, wie Du gerade selbst festgestellt hast. Um eine Library (das ist eine Sammlung von bereits compiliertem Sourcecode, bei gcc sind das Dateien namens lib*.a) zu benutzen, genügt es nicht, die Headerdatei einzubinden, die deklariert, was in der Library vorhanden ist, sondern man muss seinem Compiler die Library als Linkeroption mitteilen. Bei gcc erfolgt das mit der Kommandozeilenoption -l Um eine Library wie z.B. libirgendwas.a zu verarbeiten, lautet die Kommandozeilenoption -lirgendwas. Du hast bei Deinem Linkeraufruf explizit das Verwenden der Standardlibrary unterbunden: -nostdlib Abschließend: So etwas wie "paste.net" bitte nicht benutzen. Dieses Forum bietet selbst die Möglichkeit, Dateien anzuhängen; Deinen kurzen Schnipsel hättest Du auch in [ pre ] [ /pre ] - Tags direkt in Dein Posting einbinden können.
Rufus Τ. F. schrieb: > Deinen kurzen Schnipsel > hättest Du auch in [ pre ] [ /pre ] - Tags direkt in Dein Posting > einbinden können. Nebenfrage: wo findet man eine Zusammenfassung aller möglichen Steuerzeichen/SteuerTokens/Einbettungsoptionen?
Danke das du reingeguckt hast.
1 | int main(void) |
2 | {
|
3 | char ary[5]; |
4 | sprintf(ary,"%s",ary); |
5 | return 0; |
6 | }
|
1 | ARMGNU = arm-none-eabi |
2 | |
3 | ARCH = -mcpu=cortex-m4 |
4 | AOPS = --warn --fatal-warnings |
5 | COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mthumb -std=c99 -mfloat-abi=soft |
6 | |
7 | gcc : main.gcc.thumb2.flash.bin |
8 | |
9 | all : gcc |
10 | |
11 | main.gcc.thumb2.flash.bin: main.c |
12 | $(ARMGNU)-gcc $(COPS) $(ARCH) main.c -I/usr/arm-none-eabi/include/ -L/usr/arm-none-eabi/lib/thumb/ |
1 | arm-none-eabi-gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mthumb -std=c99 -mfloat-abi=soft -mcpu=cortex-m4 main.c -I/usr/arm-none-eabi/include/ -L/usr/arm-none-eabi/lib/thumb/ |
2 | /usr/lib/gcc/arm-none-eabi/7.1.0/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000 |
3 | /tmp/cc6fDBq0.o: In function `main': |
4 | main.c:(.text.startup+0xa): undefined reference to `sprintf' |
5 | collect2: error: ld returned 1 exit status |
6 | make: *** [Makefile:31: main.gcc.thumb2.flash.bin] Error 1 |
Ich habe ein paar Aenderungen gemacht. Es fehlt immer noch das -l flag, weil ich nicht weiss welche library eigentlich die richtige ist. -lgcc z.b. hat nicht zum erfolg gefuehrt. grep -E "*sprintf*" hat auf jedenfall das vorhanden sein der Funktion in einer der headerfiles bestaetigt.
1 | /usr/arm-none-eabi/include/stdio.h:int _EXFUN(sprintf, (char *__restrict, const char *__restrict, ...) |
guest schrieb: > Es fehlt immer noch das -l flag, weil ich nicht weiss welche library > eigentlich die richtige ist. Der Compiler weiß es. Was soll das -nostdlib ? Selbst wenn das Linken funktioniert kann es sein, dass du die falsche Lib-Ausprägung erwischst. Standard-Bibliotheken und -Header finden die Tools von alleine wenn du sie nur lässt. Falls nicht, ist deine Toolchain kaputt. Besorg dir dann eine vernünftige. > -lgcc z.b. hat nicht zum erfolg gefuehrt. Dein Beispiel sollte ohne -I, -L, -l und -nostdlib funktionieren, d.h. Compilieren und Linken ohne diesen Trallala. Außerdem willst du ziemlich sicher nicht -ffreestanding. > warning: cannot find entry symbol _start wohl wegen -nostartfiles. Du brauchst dann einen eigenen Startup-Code, der zudem noch zu deinem Linker-Skript passen muss.
:
Bearbeitet durch User
Unbe Darfter schrieb: > Nebenfrage: wo findet man eine Zusammenfassung aller möglichen > Steuerzeichen/SteuerTokens/Einbettungsoptionen? Sieh Dir mal den grauen Kasten an, den das Forum rund um das Texteingabefeld darstellt, hier den Text zwischen "Antwort schreiben" und dem Texteingabefeld. Der in Klammern stehende Text "mehr Informationen..." ist ein anklickbarer Link.
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.