Mehrere Files linken (Commandline, AVR-GCC)

Gast #742583
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
#742617
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...
Persönliche Seite #742621
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.
Gast #742623
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
#742633
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
#742637
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
#742707
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren