www.mikrocontroller.net

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


Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Neubi (Gast)
Datum:

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

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


Neubi

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie wäre es mit
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...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ändere .C in .c

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

compile.bat

avr-gcc -c -Wall -Os -mmcu=atmega32 -g main.c
avr-gcc -c -Wall -Os -mmcu=atmega32 -g bla.c
avr-gcc -mmcu=atmega32 -combine bla.o main.o -o go.elf

main.c

#include <avr/io.h>
#include <stdio.h>

extern const char CBlaBla[];

int main(void)
{
        // irgendwas machen, damit es nicht wegoptimiert wird
        // zur Sicherheit im ASM-Listing nachsehen (s.u. Anm.)
  return *CBlaBla;
}


bla.c

#include <avr/io.h>
#include <avr/pgmspace.h>

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.

Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/pgmspace.h>

extern const char CBlaBla[] PROGMEM;

BLA.C
#include "BLA.H"

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

MAIN.C
#include <avr/io.h>

#include "BLA.H"

int main() {
  PORTD = pgm_read_byte(CBlaBla);
  return 0;
}
(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

Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hätte ich mich ja schwarz gesucht!

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

Harry

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.