Forum: Compiler & IDEs codeblocks, avr-gcc, Linker-Probleme


von E. H. (emax)


Lesenswert?

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 ?

von E. H. (emax)


Lesenswert?

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.

von Torsten K. (ago)


Lesenswert?

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.

von E. H. (emax)


Lesenswert?

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?

von E. H. (emax)


Angehängte Dateien:

Lesenswert?

Hier noch mal ein Foto des Dialogs.

von Torsten K. (ago)


Angehängte Dateien:

Lesenswert?

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?

von E. H. (emax)


Lesenswert?

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".

von E. H. (emax)


Lesenswert?

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) &gt; $(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>

von Torsten K. (ago)


Lesenswert?

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.

von E. H. (emax)


Lesenswert?

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.

von Torsten K. (ago)


Lesenswert?

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

von E. H. (emax)


Lesenswert?

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
#

von Torsten K. (ago)


Lesenswert?

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

von E. H. (emax)


Lesenswert?

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?

von Torsten K. (ago)


Lesenswert?

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.

von E. H. (emax)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.