Ich habe heute auf meinem Ubuntu 10.04 codeblocks, avr-gcc und das
notwendige Zubehör installiert.
Wenn ich ein AVR-Projekt erstelle, funktioniert das auch alles sehr
schön, aber eine Merkwürdigkeit gibt es doch. Ich poste mal den
"build-log" aus Codeblocks:
1 | -------------- Build: Debug in cbv4 ---------------
| 2 |
| 3 | Compiling: main.c
| 4 | Linking console executable: bin/Debug/cbv4.elf
| 5 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible /usr/lib/libm.so when searching for -lm
| 6 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible /usr/lib/libm.a when searching for -lm
| 7 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
| 8 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
| 9 | Output size is 6,47 KB
| 10 | Running project post-build steps
| 11 | avr-size bin/Debug/cbv4.elf
| 12 | text data bss dec hex filename
| 13 | 160 0 0 160 a0 bin/Debug/cbv4.elf
| 14 | avr-objcopy -O ihex -R .eeprom -R .eesafe bin/Debug/cbv4.elf bin/Debug/cbv4.elf.hex
| 15 | avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O ihex bin/Debug/cbv4.elf bin/Debug/cbv4.elf.eep.hex
| 16 | avr-objdump -h -S bin/Debug/cbv4.elf > bin/Debug/cbv4.elf.lss
| 17 | Process terminated with status 0 (0 minutes, 0 seconds)
| 18 | 0 errors, 0 warnings (0 minutes, 0 seconds)
|
Offensichtlich versucht der avr-linker, mit den (natürlich
inkompatiblen) Bibliotheken meines Systems zu linken, also
/usr/lib/libm.so etc.
Ich finde aber nicht raus, wo in codeblocks das definiert ist. Ich habe
schon alle Options und Preferences abgegrast, nichts zu machen. Zuvor
hatte ich auch ~/.codeblocks sicherheitshalber gelöscht, keine Änderung.
Wenn ich normal mit dem emacs hantiere, und den avr-gcc mit M-x compile
aufrufe, ist alles in Butter. Es scheint also wirklich an Codeblocks zu
liegen. Die Version ist 'svn 6840', 'Build: Nov 7 2010 11:58:36 ...'
Wie an meinem Nick unschwer zu erkennen ist, bin ich hardcore-emacser,
und werde künftig wahrscheinlich ohnehin nur mit emacs und avr-gdb
direkt arbeiten - weil mich das IDE-Geraffel eher nervt. Aber es
beunruhigt mich einfach, wenn es via Codeblocks nicht richtig läuft.
Wer kann mir denn da mal einen Tipp geben ?
Mann Mann Mann! Jetzt hab ich es gefunden. Komisch, dass man sowas immer
erst findet, wann man wo rumgeheult hat ...
Also für die, die es interessiert:
Beginnend in der Menüleiste oben 'Settings->Compiler and Debugger'
anwählen.
Dort in der oberen Dropdown-Liste 'GNU AVR GCC Compiler' auswählen.
Den Tab 'Search Directories' anwählen
Den Untertab 'Compiler' anwählen, dann den Button 'Clear' wählen und
bestätigen.
Dann den Untertab 'Linker' anwählen und wieder den Button 'Clear' wählen
und bestätigen.
Es ist auf beiden Untertabs übrigens eine Option 'Policy' zu sehen, die
man aber nicht anwählen kann: 'Use Project options only'. Das wäre
sicher das Richtige, aber ich weiß im Moment nicht, wie das aktiviert
werden kann.
Jetzt funktioniert es wie es soll.
Allerdings sind nun die globalen Compilerflags für alle Compilertypen
geändert, was so eigentlich nicht ganz perfekt ist. Mich stört's nicht,
weil ich für reguläre, auch sehr große Projekte ansonsten nur den emacs
nehme.
Vielleicht kennt ja jemand die richtige Lösung für Codeblocks.
Unter Code::Blocks 10.05 ist es in den Projekteigenschaften:
Menü "Project" -> "Build Options..." - hier kannst du für jedes Projekt
die Compiler(-eigenschaften) setzen.
Und: Hier kannst du auch die Policy für die verschiedenen Targets wählen
(Release, Debug, ... was man halt so nicht braucht).
Nachtrag: Da es in den globalen Einstellungen keine Targets gibt, fehlt
dort ja auch die Policy.
Danke für den Tipp, das mit der Policy ist mir jetzt klar. Aber weiter
komme ich immer noch nicht: Ich habe ein neues Projekt angelegt, und in
'Project->Properties->Build Targets->Build options' das Target 'Debug'
ausgewählt, und dort für "Search Directories" für Compiler und Linker
jeweils "Use target options only" angegeben.
Wenn ich das komplette Compiler Kommando loggen lasse, sieht das so aus:
1 | -------------- Build: Debug in cbv5 ---------------
| 2 |
| 3 | avr-g++ -L/usr/lib -o bin/Debug/cbv5.elf obj/Debug/main.o
| 4 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible /usr/lib/libm.so when searching for -lm
| 5 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible /usr/lib/libm.a when searching for -lm
| 6 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
| 7 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
| 8 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: avr:107 architecture of input file `obj/Debug/main.o' is incompatible with avr output
| 9 | Process terminated with status 1 (0 minutes, 0 seconds)
| 10 | 0 errors, 0 warnings (0 minutes, 0 seconds)
|
Wie man sieht, durchsucht der Linker /usr/lib, was falsch ist.
Welche Einstellung müsste ich nach Deiner Anleitung denn genau ändern?
Hier noch mal ein Foto des Dialogs.
Ich habe nun mal bei mir ein neues Projekt erstellt (Prozessor atmega8),
und direkt die Einstellungen bei "Search Directories" so eingestellt wie
du es sagst und das default main.c gebaut. Siehe Bild - alles i.O.
Irgendwie wird bei Dir auch kein avr-gcc aufgerufen wenn ich das richtig
sehe? Und ich vermisse Angaben wie "-mmcu=atmega8
-Wl,-Map=bin/Debug/test.elf.map,--cref
-L/usr/x86_64-pc-linux-gnu/avr/lib -L/usr/avr/lib"
Welche Codeblocks-Version ist denn das bei Dir?
Hallo Thorsten,
danke dass Du Dir die Möhe machst. Ich konnte nicht eher anworten, weil
ich gestern zwischen allen Stühlen hing da div. Flüge sorniert wurden.
> Welche Codeblocks-Version ist denn das bei Dir?
Steht oben:
> Es scheint also wirklich an Codeblocks zu
> liegen. Die Version ist 'svn 6840', 'Build: Nov 7 2010 11:58:36 ...'
also ziemlich "frisch".
Ich hab hier mal die Projektdatei cbv5.cbp angehängt, vielleicht siehst
Du etwas, was bei Dir anders ist.
1 | <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
| 2 | <CodeBlocks_project_file>
| 3 | <FileVersion major="1" minor="6" />
| 4 | <Project>
| 5 | <Option title="cbv5" />
| 6 | <Option pch_mode="2" />
| 7 | <Option compiler="avrgcc" />
| 8 | <Build>
| 9 | <Target title="Debug">
| 10 | <Option output="bin/Debug/cbv5.elf" prefix_auto="1" extension_auto="0" />
| 11 | <Option object_output="obj/Debug/" />
| 12 | <Option type="1" />
| 13 | <Option compiler="avrgcc" />
| 14 | <Option projectLinkerOptionsRelation="1" />
| 15 | <Option projectIncludeDirsRelation="1" />
| 16 | <Option projectLibDirsRelation="1" />
| 17 | <Compiler>
| 18 | <Add option="-g" />
| 19 | </Compiler>
| 20 | </Target>
| 21 | <Target title="Release">
| 22 | <Option output="bin/Release/cbv5.elf" prefix_auto="1" extension_auto="0" />
| 23 | <Option object_output="obj/Release/" />
| 24 | <Option type="1" />
| 25 | <Option compiler="avrgcc" />
| 26 | <Option projectIncludeDirsRelation="0" />
| 27 | <Option projectLibDirsRelation="0" />
| 28 | <Compiler>
| 29 | <Add option="-Os" />
| 30 | </Compiler>
| 31 | </Target>
| 32 | </Build>
| 33 | <Compiler>
| 34 | <Add option="-Wall" />
| 35 | <Add option="-mmcu=atxmega128a1" />
| 36 | <Add option="-DF_CPU=16000000UL" />
| 37 | </Compiler>
| 38 | <Linker>
| 39 | <Add option="-mmcu=atxmega128a1" />
| 40 | <Add option="-Wl,-Map=$(TARGET_OUTPUT_FILE).map,--cref" />
| 41 | </Linker>
| 42 | <ExtraCommands>
| 43 | <Add after="avr-size $(TARGET_OUTPUT_FILE)" />
| 44 | <Add after="avr-objcopy -O ihex -R .eeprom -R .eesafe $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_FILE).hex" />
| 45 | <Add after="avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_FILE).eep.hex" />
| 46 | <Add after="avr-objdump -h -S $(TARGET_OUTPUT_FILE) > $(TARGET_OUTPUT_FILE).lss" />
| 47 | </ExtraCommands>
| 48 | <Unit filename="main.c">
| 49 | <Option compilerVar="CC" />
| 50 | </Unit>
| 51 | <Extensions>
| 52 | <envvars />
| 53 | <code_completion />
| 54 | <lib_finder disable_auto="1" />
| 55 | <debugger />
| 56 | </Extensions>
| 57 | </Project>
| 58 | </CodeBlocks_project_file>
|
Also erster Test. Ich habe alle Einstellungen aus Deinem Projektfile
übernommen. Die einzigen Unterschiede bei mir sind:
1) "-mmcu=atxmega128a1" -> bei mir atmega8.
2) "cbv5" heißt bei mir "test"
Und was soll ich sagen... kein Fehler.
Ich habe allerdings eine defekte Toolchain so wie's aussieht, denn mein
avr-gcc kann atxmega128* nicht.
Ich werde das später noch auf meiner Ubuntu-Möhre testen.
Ok, vielen Dank für Dein Engagement.
Ich muss mal ein wenig wühlen, bei mir ist das eine Linux-Plattform.
Vielleicht habe ich irgendwelche Konfigurationsdateien übersehen.
Komisch ist auch, hab ich eben erst bemerkt, dass bei mir
"avr-g++ -L/usr/lib -o bin/Debug/cbv5.elf obj/Debug/main.o"
erscheint, also der C++ Compiler ... :-o
Nur: C++ Konstrukte lehnt er trotzdem ab.
Edgar Hermanns schrieb:
> Ich muss mal ein wenig wühlen, bei mir ist das eine Linux-Plattform.
Bei mir auch (gentoo + ubuntu auf zwei verschiedenen Rechnern)
Edgar Hermanns schrieb:
> "avr-g++ -L/usr/lib -o bin/Debug/cbv5.elf obj/Debug/main.o"
"avr-g++" ist nicht das Problem (erscheint bei mir auch) aber irgendwie
fehlt bei Dir davor der avr-gcc aufruf, und außerdem steht bei dir
"-L/usr/lib" das muß aber "-L/usr/avr/lib" sein.
Dir fehlt irgendwie die avrlibs (evtl.)
apt-get install avr-libc binutils-avr
Edit: Bei Ubuntu muß es wohl "-L/usr/lib/avr" sein
Tja, das ist alles installiert: 1 | # apt-get install avr-libc binutils-avr
| 2 | Paketlisten werden gelesen... Fertig
| 3 | Abhängigkeitsbaum wird aufgebaut
| 4 | Status-Informationen einlesen... Fertig
| 5 | avr-libc ist schon die neueste Version.
| 6 | binutils-avr ist schon die neueste Version.
| 7 | binutils-avr wurde als manuell installiert festgelegt.
| 8 | 0 aktualisiert, 0 neu installiert, 0 zu entfernen und 8 nicht aktualisiert.
| 9 | #
|
Auf dem Ubuntu-Rechner habe ich codeblocks, avrgcc usw. frisch
installiert und ein neues Projekt erstellt:
-------------- Build: Debug in test ---------------
Compiling: main.c
Linking console executable: bin/Debug/test.elf
/usr/lib/libm.so: file not recognized: File format not recognized
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings
So, in Codeblocks unter "Settings" > "Compiler and Debugger..."
Oben Selected Compiler "GNU AVR GCC Compiler" auswählen
unter "Search directories" das "/usr/include" in "/usr/lib/avr/include"
ändern.
Wie in Beitrag "Code blocks debug Problem" beschrieben dann noch
unter "Project->Build Options -> Search directories -> Linker"
sicherstellen, das "/usr/lib/avr/lib" hier hinterlegt ist.
Nun läuft es bei mir auch unter Ubuntu....
Was für ein K(r)ampf
Jou, man muss schon hartnäckig bleiben, das stimmt.
Deine Änderungen habe ich hier so nachvollzogen, und nun sieht auch der
gcc-Befehl besser aus. Aber es scheint so aus, als hätte ich eine "nicht
passende" avr-libc:
1 | avr-gcc -L/usr/lib/avr/lib -o bin/Debug/cbv7.elf obj/Debug/main.o -mmcu=atxmega128a1 -Wl,-Map=bin/Debug/cbv7.elf.map,--cref -Wl,--section-start=.data=0x801100
| 2 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible /usr/lib/avr/lib/libc.a when searching for -lc
| 3 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: address 0x801100 of bin/Debug/cbv7.elf section `.data' is not within region `data'
| 4 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: bin/Debug/cbv7.elf section `.bss' will not fit in region `data'
| 5 | /usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: address 0x801100 of bin/Debug/cbv7.elf section `.data' is not within region `data'
|
Ich muss jetzt mal sehen, ob ich in die /etc/apt/sources.list ein
bestimmtes Repository für die avr-libc setzen muss.
Hast Du dazu vielleicht eine Information?
Edgar Hermanns schrieb:
> Ich muss jetzt mal sehen, ob ich in die /etc/apt/sources.list ein
> bestimmtes Repository für die avr-libc setzen muss.
Ich habe bei Ubuntu das Standard-Zeug genommen (codeblocks, avr-libc
usw.) und keine Extra-Repositories eingetragen. Die Kiste läuft also
quasi out-of-the-box.
Ok, danke. Das werde ich vielleicht auch mal so einstellen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|