Forum: Mikrocontroller und Digitale Elektronik Mehrere Files linken (Commandline, AVR-GCC)


von Harry (Gast)


Lesenswert?

Hallo Gemeinschaft,

ich möchte in einer C-Datei (BLA.C) konstante Werte ablegen, etwa

const char CBlaBla[] PROGMEM = {"Hallo"};

...und in einer anderne Datei (MAIN.C) nutzen.

Die Files werden individuell compiliert (ohne Link), Optionen
-c -Wall -Os -mmcu=atmega32 -g

(Klappt, kleine Objects erblicken das Licht dieser Welt ;-)

Zum Linken rufe ich den AVR-GCC mit den Optionen
-mmcu=atmega32 -combine BLA.OBJ Main.OBJ -o GO.ELF

auf, der meckert aber:

Main.C:(.text+0x6de): undefined reference to `CBlaBla'


Schon ein kleiner Hinweis wäre traumhaft, die Forum-Suche war bei mir 
leider erfolglos...

mfg Harry

von Neubi (Gast)


Lesenswert?

muss man nicht variablen und/oder funktionen von anderen files als 
"extern" definierren ???

dh: im main.c "extern const char CBlaBla[];"


Neubi

von David M. (md2k7)


Lesenswert?

Hallo,

wie wäre es mit
1
extern const char CBlaBla[] PROGMEM;
(nicht getestet und ohne Gewähr ;o) )

in main.c? Idealerweise hat man für sowas eine Headerdatei, die das 
beinhaltet und inkludiert wird (z.B. "bla.h").

Gruß
David

Edit: war wohl wieder jemand schneller...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ändere .C in .c

Im Moment benutzt du wegen der Endung der Quelltexte den C++ Compiler

compile.bat
1
avr-gcc -c -Wall -Os -mmcu=atmega32 -g main.c
2
avr-gcc -c -Wall -Os -mmcu=atmega32 -g bla.c
3
avr-gcc -mmcu=atmega32 -combine bla.o main.o -o go.elf

main.c
1
#include <avr/io.h>
2
#include <stdio.h>
3
4
extern const char CBlaBla[];
5
6
int main(void)
7
{
8
        // irgendwas machen, damit es nicht wegoptimiert wird
9
        // zur Sicherheit im ASM-Listing nachsehen (s.u. Anm.)
10
  return *CBlaBla;
11
}

bla.c
1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3
4
const char CBlaBla[] PROGMEM = {"Hallo"};

Anm.: Du solltest auf make und Makefiles umstellen. Du erhälst weitere 
Ausgaben z.B. mit einem ASM-Listing, MAP-Dateien usw. und kannst 
bequemer Libaries einbinden.

von Harry (Gast)


Lesenswert?

Hallo Neubi + David,

genau diese extern-Deklaration habe ich in MAIN.C (sonst würde das nicht 
compilieren).

Der Linker meckert trotzdem!?

Kann evtl. mal einer gegenchecken, ob solche externen 
PROGMEM-Geschichten bei ihm klappen?

mfg

Harry

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Harry wrote:
> Kann evtl. mal einer gegenchecken, ob solche externen
> PROGMEM-Geschichten bei ihm klappen?

Das habe ich gemacht. Wie ich es gemacht habe, steht in meinem 
vorhergehenden Beitrag. Ich kann nur deinen Fehler provozieren, wenn ich 
.C statt .c benutze.

von Peter D. (peda)


Lesenswert?

Harry wrote:

> Die Files werden individuell compiliert (ohne Link), Optionen
> -c -Wall -Os -mmcu=atmega32 -g

Und warum nicht compilieren und linken in einem Rutsch?

Ich machs immer so:

avr-gcc.exe -xc -Os -mmcu=atmega32 -Wall -g -o test.out *.c
avr-objcopy.exe -O ihex test.out test.hex
avr-objdump.exe -t -h -S test.out >test.lst
avr-size.exe -B test.out


Die Aufrufe avr-objdump und avr-size sind nur zur Information.
Ich guck mir gerne mal das Code-Listing mit den C-Zeilen an.


Peter

von David M. (md2k7)


Lesenswert?

Hallo,

erstaunlicherweise hast du Recht, das Ganze benimmt sich bei mir (WinAVR 
mit avr-gcc 4.1.1 + AVR-Studio) genauso. (Ich habe die Filenamen exakt 
so übernommen -> C++)
Abhilfe schafft zB Folgendes (hab' ich Headerfiles nicht schon mal 
erwähnt? :-) ):

BLA.H
1
#include <avr/pgmspace.h>
2
3
extern const char CBlaBla[] PROGMEM;

BLA.C
1
#include "BLA.H"
2
3
const char CBlaBla[] PROGMEM = {"Hallo"};

MAIN.C
1
#include <avr/io.h>
2
3
#include "BLA.H"
4
5
int main() {
6
  PORTD = pgm_read_byte(CBlaBla);
7
  return 0;
8
}
(hier ist das Ausgeben recht sinnfrei und nur zum Umgehen etwaiger 
Optimierungen gedacht)


P.S. an einen der "Profis": könnt ihr erklären, warum das so ist?

Edit: hat sich das erledigt, ist anscheinend eine Macke von C++.

Edit2 Das Wörtchen extern in BLA.C macht's. Anscheinend wird das 
Symbol nur in diesem Fall global exportiert.

Gruß
David

von Harry (Gast)


Lesenswert?

Da hätte ich mich ja schwarz gesucht!

Vielen Dank für die Unterstützung!!!

Harry

von Peter D. (peda)


Lesenswert?

Stefan "stefb" B. wrote:

> Das habe ich gemacht. Wie ich es gemacht habe, steht in meinem
> vorhergehenden Beitrag. Ich kann nur deinen Fehler provozieren, wenn ich
> .C statt .c benutze.

Man kann mit dem Schalter -xc erzwingen, daß die Files nur als c 
compiliert werden, nicht als C++.

Dann könnte man sogar die hier haufenweise geposteten txt-Files 
compilieren.


Peter

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.